MySQL IN 子句中的多列
问题:
您有一个数据库表四列代表地理坐标:x0、y0、x1 和 y1。这些列上有一个索引,顺序为 x0、y0、x1、y1。您希望使用 WHERE IN 子句中的坐标对列表来高效查询表。
解决方案:
要有效使用索引,请将 IN 谓词重写为一系列 OR 条件,其中每个条件将当前行的坐标与
示例:
代替:
(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 ) )
优化较新的 MySQL 版本:
中MySQL 的新版本中,优化器已得到改进,可以更好地利用此类查询中的索引。语法:
(a,b) IN ((7,43),(7,44),(8,1))
已被支持很长时间,但之前存在性能问题。新的优化器现在可以生成更高效的执行计划。
注意:
类似的优化适用于 WHERE 子句中的 OR 构造。为了提高效率,请考虑使用:
WHERE ( seq >= 7 ) AND ( seq > 7 OR sub > 42 )
而不是:
WHERE ( seq > 7 ) OR ( seq = 7 AND sub > 42 )
以上是如何高效使用MySQL WHERE IN 子句中的多列和索引?的详细内容。更多信息请关注PHP中文网其他相关文章!