我有以下查询:
select *
from t
where t.a = '1' or t.b = '2' or t.c = '3'
执行全扫描,因为没有单个索引可以满足这些条件。
有没有办法避免完全扫描并使用索引?
答案 0 :(得分:2)
根据documentation,MySQL确实提供了"索引合并"。但是,我不确定它在实践中是否真的被广泛使用。
首先,我假设你有t(a)
,t(b)
和t(c)
的索引。然后,检查索引合并是否有帮助。
如果没有,请将查询重新定义为UNION
(不是UNION ALL
)查询:
select t.*
from t
where t.a = '1'
union
select t.*
from t
where t.b = '2'
union
select t.*
from t
where t.c = '3';
每个子查询都应使用索引。 UNION
确实会导致删除重复项的开销。如果您知道没有重复项(或者不关心它们),请将UNION
更改为UNION ALL
。
答案 1 :(得分:-1)
为什么不在你的3列上创建一个复杂的索引?
您可以创建INDEX(a,b,c),参见参考:MySQL Multiple-Column Indexes