MySQL在 5.0版本中引入新特性:索引合并优化(Index merge optimization),当查询中单张表可以使用多个索引时,同时扫描多个索引并将扫描结果进行合并。
通俗解释就是: 一条SQL中使用两个或多个索引,查出来的数据集取交集或并集
该特新主要应用于以下三种场景:
1、 对OR语句求并集,如查询SELECT * FROM TB1 WHERE c1=“xxx” OR c2=""xxx"时,如果c1和c2列上分别有索引,可以按照c1和c2条件进行查询,再将查询结果合并(union)操作,得到最终结果
2、 对AND语句求交集,如查询SELECT * FROM TB1 WHERE c1=“xxx” AND c2=""xxx"时,如果c1和c2列上分别有索引,可以按照c1和c2条件进行查询,再将查询结果取交集(intersect)操作,得到最终结果
3、 对AND和OR组合语句求结果
注意事项:
select * from LHY where name = “lhy” and A > 100 or B > 100;
LHY表中包含索引 A 索引 B
不是使用合并索引就一定能够提高效率
- 当索引A 查出来数据为100W条, 索引B查出来的数据只有100条,当两个数据集取交集时,还是比价消耗IO的
遇到这种情况可以尝试优化SQL来实现(union)
select * from LHY where name = “lhy” and A > 100 union all select * from LHY where name = “lhy” and B > 100 and A <= 100;
第二条sql中要包含第一条sql中的反操作,避免数据重复