2009-10-30 40 views
-1

我的主管告诉我这个查询会'崩溃服务器'(因为它拥有数百万张我相信的表)。谁能告诉我为什么?也许让我看到我想要做的事情?我正在阅读手册来解决这个问题。MySql查询速度慢。 `加入Tbl AS t ON t.c = t0.c`

我被告知这些连接是缓慢的。什么是缓慢的呢?

"JOIN A AS o ON a.A =aa.A " . 
"JOIN B AS i ON ... " . 
"JOIN C AS p ON ... " . 
"JOIN D as t ON ... " 
"JOIN DB.E as a ON ... " . 
"JOIN DB.F as d ON ... " . 
"JOIN DB.G as g ON ... " . 
"JOIN DB.H AS h ON ... " . 
+1

如果你发布了一个实际的查询,而不仅仅是一个连接列表,它会更有帮助。没有它,你不会得到真正相关的问题。 – longneck 2009-10-30 19:05:25

+0

您是否尝试过对该查询进行EXPLAIN?只是好奇:) – 2009-10-30 19:06:23

回答

3

一对夫妇的想法:

  1. 有一个数据库是归......一个不应该加入这么多表连接在一起来获得他们所需要的参数。如果数据经常一起使用,将列保留在多个表中和/或合并表可能是有意义的。

  2. 如果你正在生成一个报告(不能想到许多其他输出,你想要这么多列),这个查询需要运行多久?考虑使用ETL流程从各种源表中逐步构建数据,并将其加载到单个表中以供您查询。

  3. 请确保您具有适当的索引。

而且,假设你使用MySQL(这个问题并没有真正说明),你可以随时使用“解释”的语句来告诉你如何坏的这个查询...

+0

+1主要针对数据库过于标准化,但总体来说很好的答案。这些使用了我大学里最大的错误。 – 2009-10-30 19:06:20

+0

EXPLAIN文档(http://dev.mysql.com/doc/refman/5.1/en/explain.html)对优化查询也有很好的参考。 – Jason 2009-10-30 19:07:30

+0

是报告。是的,我用MySql标记了它。 AFAIK问题是查询而不是数据库。我检查了解释,我不明白它足以找出问题。 – 2009-10-30 19:13:48

0

你可以解析查询(运行计划而不是查询)以查看返回的估计行数。如果由于连接而返回大量的行,这样的查询可能会使数据库瘫痪(我认为JOINS的数量不是问题 - 除非超过文档中给出的限制),但JOIN项可能会返回大量数据,除非受到基于WHERE子句的索引使用的限制。另一种方法是在主SELECT部分​​中使用内联SELECT,并查看优化器提出的查询计划,特别是如果一个或多个表的行比您选择的行多得多。

SELECT * 
, (select col1 from b where b.A = A.A) as x 
... 
from A 
... 
1
JOIN A AS o ON a.A =aa.A 

这立即引起了红旗,作为连接条件没有提到表A(称为 'O')。这会给你所有行的交叉产品,这不是你想要的。您的加入条件(在ON之后)应该始终提及您刚刚加入的表格(AS 'x'中的x)。