一尘不染

MySQL IN子句中的多列

mysql

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

  • 00
  • 00
  • x1
  • 11

我有这四个列的索引,其顺序为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)。


阅读 1143

收藏
2020-05-17

共1个答案

一尘不染

为了有效利用索引,您可以重写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 )
)
2020-05-17