索引覆盖

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

这就是索引覆盖

当发起一个索引覆盖的查询时,在explain的extra列会显示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

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;

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

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

 使用索引下推后由两次回表变为一次,提高了查询效率。

什么是索引覆盖?什么是索引下推?相关推荐

  1. 覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推

    写在前面 在MySQL数据库中,索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率.今天我们来聊聊在MySQL索引优化中两种常见的方式,索引覆盖和 ...

  2. mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖

    一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...

  3. MySQL索引覆盖扫描(覆盖索引)

    查询优化: 索引覆盖扫描--当索引中的列包含所有查询中要使用的列的时候,就会用到覆盖索引,效率比较高. 因为尽量使select后面的字段是where中的索引字段.

  4. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  5. mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?

    转自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651962609&idx=1&sn=46e59691257 ...

  6. mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...

    聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...

  7. 什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推

    聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...

  8. mysql非聚集索引区间查询_mysql的聚集索引和非聚集索引,回表查询,索引覆盖,最左前缀原则略解...

    什么是聚集索引和非聚集索引 我们知道 Mysql 底层是用 B+ 树来存储索引的,且数据都存在叶子节点.对于 InnoDB 来说,它的主键索引和行记录是存储在一起的,因此叫做聚集索引(clustere ...

  9. sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)

    一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...

最新文章

  1. Java 理论与实践: 流行的原子——新原子类是 java.util.concurrent 的隐藏精华(转载)...
  2. VS2010编译选项查看MSDN
  3. 深入浅出让你理解什么是LLVM
  4. 在图书馆学习红宝书的一天(二)· 慢慢看原型、原型链就看懂了~
  5. 影响了一代代前端人的 20 个里程碑式的顶级开源项目!- 2006 - 2021
  6. GDCM:创建ex-nihilo图像,创建“派生”图像的测试程序
  7. VTK:PolyData之GetMiscCellData
  8. windows server如何加强云服务器的安全性
  9. 为什么不能用python_为什么我不能用python加入这个线程?
  10. java 注解 静态变量_Spring中静态方法中使用@Resource注解的变量
  11. 佟年计算机天才不会打游戏,《亲爱的热爱的》佟年爱得卑微?其实是韩商言,爱得不够勇敢...
  12. linux 迁移类型,迁移到Linux前必须要知道的五个方面
  13. 一个案例,看懂用户画像如何做出效益
  14. 如何在Word中画横线?
  15. 前端页面加蒙版的几种方法
  16. 等保测评机构推荐证书撤销,纳入国家认证体系
  17. java中的StringBuffer类
  18. css--打字机效果
  19. Java 多线程模式 —— Guarded Suspension 模式
  20. 魔兽世界lua笔记(4、集合石插件修改,实现集合石亮灯hack)

热门文章

  1. win7电脑怎么连接wifi,win7系统如何连接wifi
  2. 天呐!java兼职接单
  3. 智汀如何让绿米Aqara无线开关一键联动不同品牌的智能设备?以智汀窗帘电机、星辰智能台灯为例
  4. python时间函数纳秒_python 时间 纳秒_Pandas时间序列(翻译)
  5. 一步一步教你开发微信扫码联合登录
  6. mysql + excel 校正线上数据
  7. VPS云主机是什么?有什么优势?
  8. 什么是CVE?常见漏洞和暴露列表概述
  9. php作业批改系统源码,在线|WEB作业批改系统
  10. 【C语言】C语言之数字金字塔全家桶