MySql查询太慢了`以t.c=t0.c上的t连接Tbl`

MySql查询太慢了`以t.c=t0.c上的t连接Tbl`,sql,mysql,performance,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    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 ... " .
有几点想法:

有一个理由认为数据库太规范化了……不应该为了得到所需的数据而将这么多表连接在一起。如果数据经常一起使用,则在多个表中保留一列和/或合并表是有意义的

如果您正在生成一个报告,却想不出还有多少其他输出需要这么多列,那么这个查询需要多长时间运行一次?考虑使用ETL过程从各种源表中逐步生成数据,并将其加载到单个查询表中。 确保你有适当的索引


另外,假设您使用的是MySQL,但问题并没有具体说明,您可以始终使用“EXPLAIN”语句来告诉您这个查询有多糟糕……

您可以解析查询,运行计划,但不运行查询,以查看返回的估计行数。如果由于连接而返回大量的行,那么这样的查询很可能会破坏数据库。我认为连接的数量不是问题所在——除了超过文档中给出的任何限制之外,但是连接项可能返回大量数据,除非受到基于WHERE子句的索引使用的限制。另一种方法是在主选择部分中使用行内选择,并查看优化器提出的查询计划,特别是当一个或多个表的行数明显多于您要从中选择的行数时

i、 e


这会立即引发一个危险信号,因为连接条件没有提到名为“o”的表a。这将得到所有行的叉积,这不是您想要的。ON之后的联接条件应始终将刚刚加入x的表称为“x”。

如果发布的是实际的查询,而不仅仅是联接列表,则会更有帮助。没有它,你不会得到真正相关的问题。你试过解释这个问题吗?只是好奇:+1主要是因为数据库太规范化了,但总体来说答案不错。这是我大学毕业后最大的误称。解释文档对优化您的查询也有很好的参考。是的报告。是的,我用MySql标记了它。问题是查询,而不是数据库。我查看了explain,但我对它的理解还不足以解决问题。下面是一个在SELECT语句中使用explain的示例,该语句跨三个表进行连接:mysql>explain SELECT u.user\u name,m.location from users u Internal join meetings\u users mu on u.id=mu.user\u id Internal join meetings m on mu.meeting\u id=m.id;你所做的只是在选择之前添加关键字EXPLAIN作为第一个单词。我的意思是我确实查看了EXPLAIN和EXPLAIN extended,但我不能使用它显示的信息来找出它的慢之处
SELECT *
, (select col1 from b where b.A = A.A) as x
...
from A
...
JOIN    A AS o ON a.A =aa.A