Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql索引不起作用,查询“where(x,y)in(”_Mysql_Indexing - Fatal编程技术网

Mysql索引不起作用,查询“where(x,y)in(”

Mysql索引不起作用,查询“where(x,y)in(”,mysql,indexing,Mysql,Indexing,我有复合索引,例如索引名x,y。其中x和y-整数。为什么它不能用于下一个查询: select * from t where (x, y) in ((1, 1), (2, 2)) 解释的结果:使用where,文件排序取决于您使用的MySQL版本。在MySQL 5.7中实现了优化行构造函数的范围比较,如您展示的示例 在MySQL 5.6或更早版本中,此查询将生成结果,但无法使用索引来提高性能。它将执行表扫描 如果您的评论确认您正在使用MySQL 5.6: MySQL 5.6的解决方案是确保它使用索

我有复合索引,例如索引名x,y。其中x和y-整数。为什么它不能用于下一个查询:

select * from t
where (x, y) in ((1, 1), (2, 2))

解释的结果:使用where,文件排序取决于您使用的MySQL版本。在MySQL 5.7中实现了优化行构造函数的范围比较,如您展示的示例

在MySQL 5.6或更早版本中,此查询将生成结果,但无法使用索引来提高性能。它将执行表扫描

如果您的评论确认您正在使用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列表中的每个元素都需要一个额外的union


这可能是升级到MySQL 5.7的一个很好的理由。值得一提的是,MySQL 5.7从2015-10-21年27个月前就已经是GA版本,从那时起它已经有了11个后续的GA版本。现在它非常稳定和可靠。

你可以尝试将你的查询从i1中的x,y,j1,i2,j2,i3,j3,…。改为i1中的x,i2,i3…和j中的y1,j2,j3…。它通常在mysql 5.6中工作,并且索引使用。但是元素的计数i必须与j相同。它将得到与x=i1和y=j1 union all相同的结果,但不是所有查询的结果。并且i1,j1,i2,j2,i3,j3…必须排序。试试这个。

您的解决方案将匹配一行,其中x=1和y=2,但该行不应根据OP的值匹配这是解决问题的方法,但我迁移到MySQL 5.7。这是更好的解决方案。Bill Karwin No,你有点不对。它将匹配X=1 Y=1的行。@ MIK -但是你的错误会匹配X=1和Y=2。所以,我认为这是无效答案。