我在mysql=>table1,table2和table3中有3个表,这三个表中的数据都很大(>100k)我的连接条件是:
select * from table1 t1
join table2 t2 on t1.col1 = t2.col1
join table3 t3 on t3.col2 = t2.col2 and t3.col3 = t1.col3
这个查询呈现结果的速度非常慢,根据我的说法,问题是在第二个连接条件中,就像我删除第二个条件一样,查询会立即呈现结果。谁能解释一下查询速度慢的原因吗?提前谢谢。
2条答案
按热度按时间liwlm1x91#
因为第二个连接在两个表(两个连接)上,所以它会创建更多的求值检查。这是创建一个三角形,而不是一条长的连接线。另外,由于所有三个表都有~100k行,即使给定列上有聚集索引,也必然会有性能损失,这也是由于所有列都被检索到。至少,将select语句设置为t1.col1、t1.col2…、t2.col1。。。等等。在联接条件中使用的所有列上也有不同的索引。
更重要的是,你真的想要一个没有where子句的大连接吗?试着为每个表添加限制性条件,看看它的神奇之处,因为它首先从每个表中过滤出可用的结果集(100k可能变成10k),然后尝试联接。
还要检查sqlprofiler输出,看看是否正在使用表扫描(很可能是的),如果是这样,使用索引扫描应该可以改善这种情况。
eh57zj3b2#
你有这些索引吗?
另一个提示:不要使用
*
(如在SELECT *
)除非你真的需要所有的专栏。它会阻止某些优化。如果您想进一步讨论这个问题,请提供真实的查询和SHOW CREATE TABLE
每一张table。如果用于连接的任何列的数据类型、字符集和排序规则不同,则索引可能没有用处。
请提供
EXPLAIN SELECT ...
; 它会给我们一些线索,我们可以讨论。结果集中有多少行?听起来超过10万?如果是这样的话,那么也许网络传输时间才是真正的放缓呢?