后端开发,公众号内容包括但不限于 python、mysql、数据结构和算法、网络协议、Linux。技术人怎能只有技术和代码,如果你对投资理财、保险,英语学习、读书写作有兴趣,都欢迎来公众号【谭某人】与我交流,你总会有些收获。

在 InnoDB 中,从二级索引回到主键索引查询数据,这个过程称作回表过程,而且这个回表过程是可以被优化的,这个优化就是利用覆盖索引

先说结论,如果一个索引的字段包含了所有要查询的字段,这个索引就称作覆盖索引,覆盖索引可以减少回表过程,能有效提高查询效率

前面我们有说过,在 InnoDB 中数据都是保存在 B+ 树上,主键索引保存了整行记录,二级索引保存了主键的值。

一次查询操作,要么是遍历主键索引,要么是遍历二级索引,要么就是先遍历二级索引得到主键 id 的值,然后再到主键索引上通过主键 id 查找满足要求的记录。

如果只遍历一次 B+ 树就能获取到我们要的数据,即没有回表过程,这个效率显然是不错的,这就是覆盖索引的优势。下面看个具体的例子。

mysql> create table user(
id int(11) primary key,
name varchar(20) not null,
age int(11),
sex int(11),
index (age)) engine=InnoDB;

依然是新建一个表,创建索引,插入一些测试数据,注意这里只是为了解释说明覆盖索引,并不表示 mysql 的真实执行方式,因为会涉及到 mysql 的优化器机制,这里暂且不说了,以后再写。

1    bob 16  1
2    kom 19  0
3    gum 18  1
4    tt  20  1
5    yy  25  1

创建一个 user 表,给 age 字段添加一个二级索引,并插入上面五条数据,然后看下面这条查询语句。

select name from user where age between 18 and 21

我们来分析下这条 sql 的执行过程:

1、age 字段上有索引,mysql 会先到 age 字段的 B+ 树上找到满足条件的第一个叶子节点(age=19),这个叶子节点上保存了对应主键 id 的值 2,然后再到主键索引上找到 id 为 2 的这条记录,同时把 name 字段拿出来。

2、重复第一步的操作,继续从 age 索引上的叶子节点往后遍历找出满足条件的第二个叶子节点,同样回到主键上拿出 name 字段的值,直到遍历到不满足条件的叶子节点(age=25)。

也就是说,这条 sql 语句虽然用到了索引,但是 age 索引上并没有要查询的 name 字段,所以只能回表到主键索引上查出 name 字段,所以这个过程其实是遍历了个两个 B+ 树。

那么我们删除 age 这个单列索引,创建一个覆盖索引 (age,name), 把要查询的 name 字段也添加到索引中来。

#删除原索引
drop INDEX age on USER
#新建覆盖索引
ALTER TABLE USER add index age_name(age,name)

由于现在这个覆盖索引上的字段包含了要查询的 age 和 name 字段,免去了到主键索引上查询数据的过程,其实也就是只遍历了一个 B+ 树,可以大大提升查询效率。

添加索引虽然能提升查询效率,但索引也是需要占用额外空间的,而且索引还需要维护成本,所以通常加不加索引需要根据实际需求来权衡。

总之,在设计索引或者优化 sql 语句的时候,要尽量避免回表操作,所以使用覆盖索引是一种常用的 sql 优化手段。

所以我们平时写 sql 语句的时候,select 后面只写查询需要用到的字段,去掉不需要的字段,避免回表操作。

【End】

听说你对现在的工作不是特别满意?别担心,老王给你准备一份「Java最常见200+面试题全解析」,助力大家找到更好的工作,这份面试题包含的模块:

  • Java、JVM 最常见面试题解析

  • Spring、Spring MVC、MyBatis、Hibernate 面试题解析

  • MySQL、Redis 面试题解析

  • RabbitMQ、Kafka、Zookeeper 面试解析

  • 微服务 Spring Boot、Spring Cloud 面试解析

扫描下面二维码付费阅读

关注下方二维码,订阅更多精彩内容。

转发朋友圈,是对我最大的支持。

如何让mysql索引更快一点相关推荐

  1. MySQL 怎么变快_如何让mysql索引更快一点

    在 InnoDB 中,从二级索引回到主键索引查询数据,这个过程称作回表过程,而且这个回表过程是可以被优化的,这个优化就是利用覆盖索引. 先说结论,如果一个索引的字段包含了所有要查询的字段,这个索引就称 ...

  2. 让 Spring Boot 启动更快一点

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 "Spring有多快?" 这是 2018 Sp ...

  3. 快做这 15点,让 SpringBoot 启动更快一点!

    "Spring有多快?" 这是 2018 Spring One Platform 中的一场会议.看完会议视频,我自己动手试了一下.下面是我做出的测试结果. 还没有观看视频的朋友推荐 ...

  4. 让AI 作画更快一点

    在上一篇文章<AI 作画初体验>中给大家介绍了一款 AI 作画工具 DD (Disco Diffusion) 及其本地部署方法.初次尝试,感觉 DD 生成的画作效果还不错,就是每次运行的时 ...

  5. 让子弹飞,零成本让你的网站更快一点,boxopened http/3 (QUIC) 协议实战

    最近HTTP-over-QUIC 协议被正式命名为 HTTP/3,协议带来的最大改变是协议底层将采用UDP协议,而不再是TCP协议,这样的好处吗,就是更低时延,更好的拥塞控制,更精确的RTT时间,更高 ...

  6. 新生儿黄疸怎么做消退的更快一点?

    随着怀胎十月,宝宝出生了同样也伴随着新生儿黄疸的出现,大多由于孕母内藴湿热,传入胎儿所致,所以在怀孕前母亲一定要先调理好体质显得非常重要.既然宝宝出现了黄疸,我们看下有哪些方法可以快速解决呢? 不能乱 ...

  7. 为什么MySQL索引更适合B+树而不是二叉树、B树

    一 数据库为什么使用B+树 1. 与二叉树相比 二叉树相比于顺序查找的确减少了查找次数,但是在最坏情况下,二叉树有可能退化为顺序查找.而且就二叉树本身来说,当数据库的数据量特别大时,其层数也将特别大. ...

  8. 公文排版插件for Word/WPS【公文助手——让公文排版更快一点】

    公文助手是一款Office VSTO插件,安装后可在WORD或WPS菜单栏找到公文助手菜单.本插件可根据<党政机关公文格式国家标准>(GB/T 9704-2012)的格式要求,快速设置页面 ...

  9. 公文排版插件for Word/WPS【审计公文助手——让公文排版更快一点】

    审计公文助手是一款Office VSTO插件,安装后可在WORD菜单栏找到.可根据<党政机关公文格式国家标准>(GB/T 9704-2012)的格式要求,快速设置页面版式.快速设置常用文字 ...

最新文章

  1. android -------- MVP+DataBinding 的使用
  2. struct task_struct 结构分析 \linux-1.0\linux\include\linux\sched.h
  3. 高能预警!这些段子已刷爆大学老师朋友圈
  4. python lncrna_lncRNA分析
  5. 程序员输入法_解决Pycharm输入法不跟随光标
  6. 计算机导论知识点整理笔记(一.数据结构)
  7. Ubuntu、SUSE的发音
  8. 券商IT的建设一定要有全局观、前瞻性,要走在业务前面,而不是被动响应
  9. 行为模型、价值模型、市场模型
  10. Win10升级要卸载virtualbox virtualbox怎么办
  11. Cglib动态代理实现方式
  12. 查看 java opts,如何在命令提示符中检查JAVA_OPTS值?
  13. 如何为macOS High Sierra创建可启动的USB安装程序
  14. Qt Moc及信号-槽源代码解析
  15. OpenSea上如何创建自己的NFT(Polygon)
  16. 版式设计中的点线面总结
  17. 三只松鼠 Kaiser:小程序如何助力品牌营销的“增长思维”?
  18. aspose转pdf乱码
  19. Excel转Json
  20. 信息系统开发与管理 04757

热门文章

  1. Latex的表格注释
  2. 使用class-validator替换Joi包的方法
  3. SpringMVC源码解析(四)——请求处理
  4. org.apache.catalina.LifecycleException: Failed to
  5. python_L2_operator
  6. 细说新一代HTML5/JavaScript的UI控件wijmo5 的新架构
  7. 侧边菜单栏 android-menudrawer
  8. Android学习—Notification消息通知
  9. Oracle SQL语句执行步骤
  10. 艾伟:ASP.NET 与 AJAX的实现方式