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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 什么是索引覆盖?什么是索引下推?

 索引覆盖

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

这就是索引覆盖

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

如何实现索引覆盖呢?

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

举个例子

先建立一张表,表结构如下

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

image.gif

然后执行sql语句:

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

image.gif

显而易见,这个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

id name level tool
1 大王 1 电话
2 小王 2 手机
3 小李 3 BB机
4 大李 4 马儿

建立联合索引(name,level)

匹配姓名第一个字为“大”,并且level为1的用户,sql语句为

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

image.gif

在5.6之前,执行流程是如下图

image.gif编辑

5.6及之后,执行流程图如下

image.gif编辑 使用索引下推后由两次回表变为一次,提高了查询效率

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
1
0
0
2
分享
相关文章
对线面试官 - 如何理解MySQL的索引覆盖和索引下推
索引下推是MySQL 5.6引入的优化,允许部分WHERE条件在索引中处理,减少回表次数。例如,对于索引(zipcode, lastname, firstname),查询`WHERE zipcode='95054' AND lastname LIKE '%etrunia%'`时,索引下推先过滤zipcode,然后在索引中应用lastname条件,降低回表需求。索引下推可在EXPLAIN的`Using index condition`中看到。
对线面试官 - 如何理解MySQL的索引覆盖和索引下推
接口的幂等性设计和防重保证,详细分析幂等性的几种实现方法
本篇文章详细说明了幂等性,解释了什么是幂等性,幂等性的使用场景,讨论了幂等和防重的概念。分析了幂等性的情况以及如何设计幂等性服务。阐述了幂等性实现防重的几种策略,包括乐关锁,防重表,分布式锁,token令牌以及支付缓冲区。
7780 0
接口的幂等性设计和防重保证,详细分析幂等性的几种实现方法
Maven之阿里云镜像仓库配置
方式一:全局配置可以添加阿里云的镜像到maven的setting.xml配置中,这样就不需要每次在pom中,添加镜像仓库的配置,在mirrors节点下面添加子节点: <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.
13个Mongodb GUI可视化管理工具,总有一款适合你
本文介绍了13个好用的MongoDB可视化工具。Robomongo,MongoDB Compass,phpMoAdmin等
109058 0
13个Mongodb GUI可视化管理工具,总有一款适合你
InnoDB为什么使用自增id作为主键
InnoDB是MySQL数据库中一种常用的存储引擎,它使用自增id作为主键的设计是出于多方面的考虑。
614 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等