MySQL IN 子句中多列高效查询
你的 MySQL 数据库有四列,分别对应地理坐标 x,y 和结束位置。您希望使用大约一百个地理对组合的列表对此数据执行有效查询。
强力方法是使用 IN 子句,如 Oracle 答案中所建议的:
SELECT * FROM my_table WHERE (x0, y0, x1, y1) IN ((4, 3, 5, 6), ... ,(9, 3, 2, 1));
但是,这种方法对于 MySQL 来说效率不高,尤其是在有大量行的情况下。
为了优化查询,我们可以利用这四列上的索引。我们可以将 IN 谓词重写为一系列 OR 条件:
( ( 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 版本的注意事项
在较新版本的 MySQL 中,优化器已得到改进,可以生成更高效的执行计划。 (a,b) IN ((7,43),(7,44),(8,1)) 语法已经支持很长时间了,但早期版本遇到了性能问题。不过,这些问题已经得到解决,较新的优化器可以有效地使用 OR 构造的索引。
结论
通过使用 OR 条件方法,您可以显着改善在 IN 子句中搜索多个列时 MySQL 查询的效率。该技术利用可用索引并确保大型数据集的最佳性能。
以上是如何在 IN 子句中使用多列高效查询 MySQL?的详细内容。更多信息请关注PHP中文网其他相关文章!