MySql查询速度慢。 `加入Tbl AS t ON t.c = t0.c`

时间:2009-10-30 18:57:02

标签: sql mysql performance

我的主管告诉我这个查询会“崩溃服务器”(因为我相信它有数百万个表)。谁能告诉我为什么?也许告诉我我想做的方式?我目前正在阅读手册来解决这个问题。

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

"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 ... " .

3 个答案:

答案 0 :(得分:3)

有几点想法:

  1. 对于规范化的数据库存在一个论点......一个人不应该将这么多表连接在一起以获得他们需要的东西。如果频繁使用数据,将列保留在多个表中和/或组合表可能是有意义的。

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

  3. 确保您已准备好适当的索引。

  4. 另外,假设你正在使用MySQL(问题没有真正指定),你总是可以使用'EXPLAIN'语句告诉你这个查询有多糟糕......

答案 1 :(得分:1)

JOIN    A AS o ON a.A =aa.A

这会立即引发一个红色标记,因为连接条件没有提到表A(称为“o”)。这将为您提供所有行的交叉产品,这不是您想要的。您的加入条件(在ON之后)应始终提及您刚加入的表格(AS 'x'中的x)。

答案 2 :(得分:0)

您可以解析查询(运行计划而不是查询)以查看返回的估计行数。如果由于连接而返回大量行,那么这样的查询可能会使数据库瘫痪(我不认为JOINS的数量是问题 - 除了超过文档中给出的任何限制时),但是事实上,JOIN术语可以返回大量数据,除非受基于WHERE子句的索引使用限制。另一种方法可以是在SELECT主要部分中使用内联SELECT,并查看优化程序提出的查询计划,特别是如果一个或多个表的行数明显多于您选择的其他表。

即。

SELECT *
, (select col1 from b where b.A = A.A) as x
...
from A
...