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



我正在连接 3 个表,a、b 和 c,它们都有一个共同的索引键字段 xID。如果我将 a 连接到 b,然后将 b 连接到 c,则查询在大约 2 秒内运行;如果我将 A 连接到 B,然后将 A 连接到 C,则查询在运行数十分钟后超时。A 很小,B 和 C 很大 (1:70:90)

使用 explain,第二个查询在第二个连接上使用连接缓冲区,并针对表 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;

对 第 2 季度

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

我希望两个查询给出相同的计数并花费大约相同的时间,但事实并非如此。Q1 = 2秒;Q2 永远不会完成。

我无法复制这个发现。

我有 3 个表,每个表包含 2 列 - (id 一个自动递增的主键,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]

最新更新