JOIN顺序影响3表内部联接选择查询的性能

时间:2019-08-13 14:24:37

标签: mysql join

我要连接3个表,a,b和c,所有这些表都有一个公用的索引键字段xID。如果我将a加入b,然后将b加入c,查询将在2秒钟后运行;如果我将a添加到b,然后将a添加到c,则查询会在运行数十分钟后超时。 a小,b和c大(1:70:90)

使用说明,第二个查询在第二个连接上使用一个连接缓冲区,并指示针对表b和c的> 1M行,但第一个查询仅对b的> 1M。改变连接顺序,将小表a置于两个大表b和c之间的中间位置总是很慢。谁能解释为什么?

第一季度

select count(distinct a.ID) 
from a 
join b on a.xID = b.xID 
join c on b.xID = c.xID;

与 第二季度

select count(distinct a.ID)
from a
join b on a.xID = b.xID
join c on a.xID = c.xID

我希望两个查询都具有相同的计数并花费大约相同的时间,但是事实并非如此。 Q1 = 2秒;第二季度永远不会完成。

1 个答案:

答案 0 :(得分:0)

我无法复制此发现。

我有3个表,每个表包括2列-(id为自动递增的PRIMARY KEY,xid为索引整数)。

table_a包含128行,具有78个不同的xid

table_b包含8192行,具有5573个不同的xid

table_c包含1048576行,具有640468个不同的xid。

不管我如何将它们结合在一起,以下查询大约花费1/10秒的时间,并返回相同的结果:

SELECT COUNT(DISTINCT a.id)n 
  FROM table_a a 
  JOIN table_b b 
    ON b.xid = a.xid 
  JOIN table_c c 
    ON c.id = a.id -- [or c.id = b.id]