我有一个查询,该查询包含在 (col1,col2) 上唯一索引的 mytable 上的联接
explain
...
join mytable on col1=1 and col2=2
通过类型:eq_ref
显示索引的正确使用
但是当使用列表时,不再使用索引
join mytable on col1=1 and col2 in (2,3,4)
额外:检查每条记录的范围(索引映射:0x1);
这给出了相同的结果:
join mytable on (col1,col2) in ((1,2),(1,3),(1,4))
在提供值列表时是否可以使用索引?
最佳答案
通常情况下,不会
JOIN x ON c = Constant
。ON
子句应指定该表如何与其他表相关。WHERE
子句应提供过滤功能,例如col1=1 和 col2=2
。“行构造函数”早已存在,但直到最近(5.7.3)它们才得到了最少的优化。你运行什么版本?即使使用最新版本,我也希望 (2,3,4) 中的
col1=1 和 col2
至少能够像行构造函数方法一样得到优化。OR
通常会阻止任何优化。也许它永远不会比某些替代方案更快。我们需要查看整个查询、
EXPLAIN
和SHOW CREATE TABLE
;可能还有其他问题潜伏在阴影中。
关于mysql - 如何在值列表上使用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56303741/