索引下推

在深入了解索引下推之前,一直没有深刻理解到这个名词的由来。

索引下推主要就是将要交给MySQL数据库server层的索引条件,下推给存储引擎完成。使得server层处理更少的数据,且与存储引擎的数据传输更少。(个人理解,如有不正确请指出)

说到索引,肯定要了解什么是索引?有哪些索引?

索引是能够实现快速查询和搜索的数据结构,也可以看作是排好序的数据结构,其中MySQL的默认引擎InnoDB的索引底层数据结构使用的是B+树。在这里可以思考一下为什么不用B树、红黑树、二叉搜索树等数据结构。

索引可以分为主键索引、唯一索引、普通索引、联合索引、聚簇索引、非聚簇索引等。数据表中的自增主键一般使用的就是主键索引,唯一索引保证没有两行记录是相同的,主键索引是唯一索引的特例。联合索引是使用一列或多列的索引,如(a,b)为一个联合索引,需按照最左匹配原则进行排序。最左匹配原则为根据区分度将索引进行降序排序,区分度为根据该列不同的值/总记录行数,因此区分度越大代表索引能过滤更多的行。

索引下推,顾名思义是将更多的索引条件交给存储引擎去做,传输更少的记录给server层处理。因此可以执行部分where条件。
例如,有联合索引(a,b),SQL语句,select * where a=1 and b=2,如果没有索引下推,那么存储引擎根据a=1找到符合条件的所有行数,将所有记录行回表查询到的所有记录传输给server层,server层再根据b=2过滤符合的行。
如果有索引下推,那么存储引擎会先判断索引条件,根据a=1找到符合的记录,再根据b=2找到两者都符合的记录,最后将符合两个条件的记录传给server层。

特别地,需要知道如果联合索引中,碰到了> < >= <=或 % 的判断条件,需要中止后续条件的判断。
例如,(a,b,c)是联合索引,select * where a=1 and b>1 and c<2,这时只会检查到a=1和b>1,c不会使用到索引。
再举个例子,select * where a>2 and b=1,需要建立什么索引?
这时需要建立(b,a)的索引,后续a和b的顺序会根据区分度自动排序为(b,a),b全局有序,而a从全局看不是有序的,当b=1时,a=1、2,可以将a看作局部有序。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值