IN子句中的MySQL多列

新手上路,请多包涵

我有一个数据库,其中四列对应于起始和结束位置的地理坐标 x,y。这些列是:

  • x0
  • y0
  • x1
  • y1

我有这四列的索引,序列为 x0、y0、x1、y1。

我有一个大约一百个地理对组合的列表。我将如何有效地查询这些数据?

我想按照 这个 SO 答案 的建议做这样的事情,但它只适用于 Oracle 数据库,而不适用于 MySQL:

 SELECT * FROM my_table WHERE (x0, y0, x1, y1) IN ((4, 3, 5, 6), ... ,(9, 3, 2, 1));

我在想可能对索引做点什么?什么是最好的方法(即:最快的查询)?谢谢你的帮助!

笔记:

  • 我无法更改数据库的架构
  • 我有大约 100’000’000 行

编辑: 原样的代码实际上可以工作,但是它非常慢并且没有利用索引(因为我们有旧版本的 MySQL v5.6.27 )。

原文由 nbeuchat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 415
2 个回答

为了有效利用索引,您可以重写 IN 谓词

(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 )
)

原文由 spencer7593 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题