mysql—在两个不同的表(不包括要连接的表)上添加连接条件是否会降低查询和性能

hjzp0vay  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(312)

我在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

这个查询呈现结果的速度非常慢,根据我的说法,问题是在第二个连接条件中,就像我删除第二个条件一样,查询会立即呈现结果。谁能解释一下查询速度慢的原因吗?提前谢谢。

liwlm1x9

liwlm1x91#

因为第二个连接在两个表(两个连接)上,所以它会创建更多的求值检查。这是创建一个三角形,而不是一条长的连接线。另外,由于所有三个表都有~100k行,即使给定列上有聚集索引,也必然会有性能损失,这也是由于所有列都被检索到。至少,将select语句设置为t1.col1、t1.col2…、t2.col1。。。等等。在联接条件中使用的所有列上也有不同的索引。
更重要的是,你真的想要一个没有where子句的大连接吗?试着为每个表添加限制性条件,看看它的神奇之处,因为它首先从每个表中过滤出可用的结果集(100k可能变成10k),然后尝试联接。
还要检查sqlprofiler输出,看看是否正在使用表扫描(很可能是的),如果是这样,使用索引扫描应该可以改善这种情况。

eh57zj3b

eh57zj3b2#

你有这些索引吗?

table2:  (col1)
table3:  (col2, col3) -- in either order

另一个提示:不要使用 * (如在 SELECT * )除非你真的需要所有的专栏。它会阻止某些优化。如果您想进一步讨论这个问题,请提供真实的查询和 SHOW CREATE TABLE 每一张table。
如果用于连接的任何列的数据类型、字符集和排序规则不同,则索引可能没有用处。
请提供 EXPLAIN SELECT ... ; 它会给我们一些线索,我们可以讨论。
结果集中有多少行?听起来超过10万?如果是这样的话,那么也许网络传输时间才是真正的放缓呢?

相关问题