【问题标题】:Mysql index didnt work, query "where (x, y) in ("Mysql索引不工作,查询“where (x, y) in ("
【发布时间】:2018-02-01 18:16:27
【问题描述】:

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

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

解释结果:使用where,文件排序

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    取决于您使用的 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 版本。现在已经相当稳定可靠了。

    【讨论】:

      【解决方案2】:

      您可以尝试将您的查询从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 和 y=2 的行,但根据 OP 的查询,该行不应匹配。
      • 这个解决方法对我有用,但我迁移到了 Mysql 5.7。这是更好的解决方案。
      • Bill Karwin 不,你有点不对劲。它将匹配 x=1 y=1 的行。
      • @Mik - 但你的会错误地匹配x=1 AND y=2。所以,我认为这是一个无效的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多