我正在连接 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]