什么是索引覆盖?什么是索引下推?

文章介绍了数据库索引优化中的两个重要概念:索引覆盖和索引下推。索引覆盖是指查询所需数据可直接从索引中获取,无需回表。通过创建联合索引可以实现。而索引下推是MySQL5.6引入的特性,允许在存储引擎层部分执行查询条件,减少回表查询次数,提高查询效率。
摘要由CSDN通过智能技术生成


一. 什么是索引覆盖?

在执行某个查询语句时,在一颗索引数上就能够获取sql所需要的所有列的数据,无需回表。这就是索引覆盖。

当发起一个索引覆盖的查询时,在explainextra列会显示Using index

如何实现索引覆盖呢?

常见方法:将被查询的字段建立到联合索引里去。

举个例子,先建立一张表,表结构如下:

create table user(
 
    id int primary key,
 
    name varchar(20),
 
    sex varchar(5),
 
    index(name)
 
)engine=innodb;

然后执行sql语句:

select id, name, sex from user where name='zhangsan'

显而易见,这个sql是可以命中name索引的,但是这个sql 不符合索引覆盖,原因就是name索引的叶子节点只存储了id和name字段,没有存储sex,sex字段必须回表查询才能获取到,需要拿到id值到主键索引获取sex字段

这时如果把(name)单列索引换成联合索引(name, sex),那就不同了,索引的叶子节点存储了主键id、name、sex那么上面的sql 语句就可以命中索引覆盖无需回表,查询效率更高

二. 什么是索引下推?

索引条件下推 也被称为 索引下推(Index Condition Pushdown)ICP,MySQL5.6新添加的特性,用于优化数据查询的。

5.6之前通过非主键索引查询时,存储引擎通过索引查询数据,然后将结果返回给MySQL server层,在server层判断是否符合条件,在以后的版本可以使用索引下推,当存在索引列作为判断条件时,Mysql server 将这一部分判断条件传递给存储引擎,然后存储引擎会筛选出符合传递传递条件的索引项,即在存储引擎层根据索引条件过滤掉不符合条件的索引项,然后回表查询得到结果,将结果再返回给Mysql server,有了索引下推的优化,在满足一定条件下,存储 引擎层会在回表查询之前对数据进行过滤,可以减少存储引擎回表查询的次数。

假如有一张表user
表有四个字段 id,name,level,tool

idnameleveltool
idnameleveltool
1大王1电话
2小王2手机
3小李3BB机
4大李4马儿

建立联合索引(name,level)
匹配姓名第一个字为“大”,并且level为1的用户,sql语句为:

select * from user where name like "大%" and level = 1

在5.6之前,执行流程是如下图:
在这里插入图片描述
5.6及之后,执行流程图如下:
在这里插入图片描述
使用索引下推后由两次回表变为一次,提高了查询效率。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值