关于条件的联合的索引用法

时间:2015-05-31 15:53:08

标签: mysql query-optimization mysql-5.5

我有以下查询:

select *
from t
where t.a = '1' or t.b = '2' or t.c = '3'

执行全扫描,因为没有单个索引可以满足这些条件。

有没有办法避免完全扫描并使用索引?

2 个答案:

答案 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