我要连接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秒;第二季度永远不会完成。
答案 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]