【发布时间】:2018-02-01 18:16:27
【问题描述】:
我有复合索引,例如INDEX name (x,y)。其中 x 和 y - 整数。为什么它不适用于下一个查询:
select * from t
where (x, y) in ((1, 1), (2, 2))
解释结果:使用where,文件排序
【问题讨论】:
我有复合索引,例如INDEX name (x,y)。其中 x 和 y - 整数。为什么它不适用于下一个查询:
select * from t
where (x, y) in ((1, 1), (2, 2))
解释结果:使用where,文件排序
【问题讨论】:
取决于您使用的 MySQL 版本。像您展示的示例那样优化行构造函数的范围比较是在 MySQL 5.7 中实现的。
在 MySQL 5.6 或更早版本中,此查询会产生结果,但无法使用索引来提高性能。它会进行表扫描。
https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html#row-constructor-range-optimization
您的评论确认您使用的是 MySQL 5.6:
MySQL 5.6 确保它使用索引的解决方法:
select * from t where x=1 and y=1
union all
select * from t where x=2 and y=2
IN() 列表中的每个元素都需要一个额外的联合。
这可能是升级到 MySQL 5.7 的一个很好的理由。值得一提的是,MySQL 5.7 自 2015 年 10 月 21 日(27 个月前)以来一直是 GA,从那时起它已经发布了 11 个后续 GA 版本。现在已经相当稳定可靠了。
【讨论】:
您可以尝试将您的查询从where (x, y) in ((i1, j1), (i2, j2),(i3,j3),.... 更改为where x in (i1,i2,i3....) and y in (j1,j2,j3,....) 它通常在mysql 5.6 中有效,并且使用索引。但元素“i”的计数必须与“j”相同。它将获得与 x=i1 and y=j1 union all 相同的结果,但并非针对所有查询。并且 i1,j1,i2,j2,i3,j3... 必须订购。试试这个。
【讨论】:
x=1 AND y=2。所以,我认为这是一个无效的答案。