【问题标题】:How to use an index on a list of values?如何在值列表上使用索引?
【发布时间】:2019-10-11 17:04:47
【问题描述】:

我有一个与 mytable 唯一索引 (col1,col2) 上的连接的查询

explain
...
join mytable on col1=1 and col2=2

type: eq_ref显示索引的正确使用

但是当使用列表时,索引不再使用

join mytable on col1=1 and col2 in (2,3,4)

Extra: Range checked for each record (index map: 0x1);

这给出了相同的结果:

join mytable on (col1,col2) in ((1,2),(1,3),(1,4))

有没有办法在提供值列表时使用索引?

【问题讨论】:

  • 它可能取决于版本,但肯定在我的(相当旧的)sql 版本中,情况就是这样。因此,解决方案是将其写成一系列带括号的 OR。

标签: mysql join indexing


【解决方案1】:
  • 通常没有JOIN x ON c = constantON 子句应指定此表与其他表的关联方式。 WHERE 子句应提供过滤功能,例如 col1=1 and col2=2

  • “行构造函数”早已存在,但直到最近 (5.7.3) 才进行了最低限度的优化。你运行的是什么版本?即使使用最新版本,我希望 col1=1 and col2 in (2,3,4) 至少与行构造函数方法一样得到优化。

  • OR 通常会阻止任何优化。也许它永远不会比其他选择更快。

  • 我们需要查看整个查询,EXPLAINSHOW CREATE TABLE;可能还有其他问题潜伏在阴影中。

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多