数据库
首页 > 数据库> > MySQL索引合并和索引下推

MySQL索引合并和索引下推

作者:互联网

什么是索引下推?

开撸

SELECT * from user where  name like '陈%'
SELECT * from user where  name like '陈%' and age=20

Mysql5.6之前的版本

Mysql5.6及之后版本

 

 InnoDB并没有忽略age这个字段,而是在索引内部就判断了age是否等于20,对于不等于20的记录直接跳过,因此在(name,age)这棵索引树中只匹配到了一个记录,此时拿着这个id去主键索引树中回表查询全部数据,这个过程只需要回表一次。

实践

总结

set optimizer_switch='index_condition_pushdown=off';

 

什么是索引合并?

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中的反操作,避免数据重复。

标签:name,age,下推,查询,索引,MySQL
来源: https://www.cnblogs.com/47Gamer/p/15110826.html