为了有效地利用索引,我们可以重写IN
谓词
example
(x0, y0, x1, y1) IN ((4, 3, 5, 6),(9, 3, 2, 1))
像这样:
( ( x0 = 4 AND y0 = 3 AND x1 = 5 AND y1 = 6 )
OR ( x0 = 9 AND y0 = 3 AND x1 = 2 AND y1 = 1 )
)
EDIT
新版本MySQL优化器修复性能问题;生成更有效地利用可用索引的执行计划。
The (a,b) IN ((7,43),(7,44),(8,1))
MySQL 的许多版本都支持这种语法,但是由于优化器生成的执行计划不是最优的,所以它存在性能问题(至少对于非平凡集)。
但优化器在较新版本的 MySQL 中得到了改进;较新的优化器可以生成更有效的执行计划。
请注意类似的相关问题OR
结构体。下面是一个示例查询,旨在获取按列排序的 20 行的“下一页”seq
and sub
(唯一的元组)。最后获取的页面 (seq,sub)=(7,42)
对于更旧版本的 MySQL,这种语法不会被接受
WHERE (seq,sub) > (7,42)
ORDER BY seq, sub
LIMIT 20
当 MySQL 确实支持该语法时,我们将得到一个执行计划,就像我们编写的一样
WHERE ( seq > 7 )
OR ( seq = 7 AND sub > 42 )
ORDER BY sub, seq
LIMIT 20
如果我们编写一些略有不同的内容,我们将获得更高效的执行计划:
WHERE ( seq >= 7 )
AND ( seq > 7 OR sub > 42 )
ORDER BY sub, seq
LIMIT 20
我们将从 MySQL 优化器中得到更好的计划。我们希望优化器计划在 (sub,seq) 上使用可用的 UNIQUE INDEX,并从范围扫描操作中按索引顺序返回行...