你知道mysql的索引下推么?
在此之前,需要先明白mysql内部的一个大致结构,mysql内部大概是划分为3处,client客户端连接,server层,存储引擎层
索引下推是mysql5.6之后内部的一种索引优化手段。
比如现在我有一张表student表,字段有id,name,age,note等等字段,然后我现在对name和age建立了一个组合索引,然后我现在执行一条语句:
select * from student where name like '周%' and age > 25;
我们知道此时这个组合索引是一个辅助索引树结构,说到辅助索引肯定就联想到回表,但是辅助索引会不会回表,取决于是否是覆盖索引。很明显,现在是*,查询所有字段,不是覆盖索引,那么就一定会回表,那么在mysql5.6,没有索引下推的时候,是以下这样执行的:
尽管建立了联合索引,但是Mysql5.6之前在储存引擎层的时候,还是只会通过辅助索引树的叶子结点找到name是为姓周的,而age是不管的(Mysql5.6的时候会管),然后再通过叶子结点上索引对应的主键ID回表主键索引树,找到主键对应的行记录,然后再把周的那些行记录返回给Mysql的Server层,Mysql服务层再此层再筛选出age大于25的行记录,再把结果返回给客户端。那么此时如果姓周的结果是有100人,那么此时就需要回表100次,然后Mysql服务层再筛选出符合age > 25的记录给客户端。那么能不能就一次性在辅助索引树上就把姓周并且age> 25的筛选出来,那么这样的话就可以只回表一次,然后直接将最终结果返回给Mysql的Server层既可。这样就可以大大减少回表次数了。
所以在Mysql5.6之后,Mysql内部对此进行了优化也就是索引下推。
由于建立了联合索引,那么通过辅助索引树的叶子节点找到name是姓周的,同时会把age > 25的也筛选出来,然后最终满足的记录比如是2条,再回表2次查询主键索引树,然后把2条结果返回给Mysql的Server层,Mysql的Server层再直接把数据返回给客户端大大减少了回表次数。
没有使用索引下推,回表次数多,Mysql的Server层需要筛选记录。
使用索引下推,回表次数少,Mysql的Server层不需要筛选记录,直接返回给客户端。
总结:
索引下推是Mysql5.6之前在数据库内部为了减少回表次数而优化的一个点。