使用 2 个表(A 和 B),可通过它们的 PK 连接,A 的主键按 DESC 排序(PK 按 MySQL 8 允许的降序排列),并且 A 有 2 个按 ASC 排序的索引。
当我执行类似的查询时
SELECT * FROM `A` a
LEFT JOIN `B` b ON a.id <=> b.id
WHERE a.idx1 = 'X' AND a.idx2 = 'Y';
Run Code Online (Sandbox Code Playgroud)
它不会返回任何内容...但是,如果我添加一个精确的条件,例如:
SELECT * FROM `A` a
LEFT JOIN `B` b ON a.id <=> b.id
WHERE a.idx1 = 'X' AND a.idx2 = 'Y' AND a.id = 1337;
Run Code Online (Sandbox Code Playgroud)
它将查找具有指定值作为 PRIMARY KEY 的行。
解释表明,当 MySQL 没有找到任何内容时,它将使用“index_merge_intersection”优化。如果我们禁用“index_merge”优化,第一个查询将按预期返回所有结果。
为什么?