mysql利用覆盖索引避免回表优化查询

 更新时间:2021年02月05日 11:42:22   作者:家有四只胖加菲  
这篇文章主要给大家介绍了关于mysql如何利用覆盖索引避免回表优化查询的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

说到覆盖索引之前,先要了解它的数据结构:B+树。

先建个表演示(为了简单,id按顺序建):

id name
1 aa
3 kl
5 op
8  aa
10 kk
11 kl
14 jk
16 ml
17 mn
18 kl
19 kl
22 hj
24 io
25 vg
29 jk
31 jk
33 rt
34 ty
35 yu
37 rt
39 rt
41 ty
45 qt
47 ty
53 qi
57 gh
61 dh

 以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。

非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。

B+树

B+树和B树是mysql索引的常用数据结构,B+树是B树的进一步优化,将上面的表转成图分析一下:

B+树的特点:

1.B+ 树非叶子节点上是不存储数据的,仅存储键值

2.叶子节点的数据是按照顺序排列的

3. B+ 树中各个页之间是通过双向链表连接

聚簇索引和非聚簇索引

B+ 树索引按照存储方式的不同分为聚集索引和非聚集索引。

聚簇索引:

以 InnoDB 作为存储引擎的表,表中的数据都会有一个主键,即使你不创建主键,系统也会帮你创建一个隐式的主键。

这是因为 InnoDB 是把数据存放在 B+ 树中的,而 B+ 树的键值就是主键,在 B+ 树的叶子节点中,存储了表中所有的数据。

这种以主键作为 B+ 树索引的键值而构建的 B+ 树索引,我们称之为聚集索引。

非聚簇索引:

以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。

非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。

如何用覆盖索引避免回表

为什么明明用了非主键索引还会回表,简单说就是非主键索引是非聚簇索引,在B+树叶子节点中只保存主键和该非主键索引,一次查询只能查到这两个字段,如果想查三个字段,就必须再查一次聚簇索引,这就是回表。

举个例子,表中新增一个字段age,我们用name建一个索引(非聚簇索引)

id name age
10  zs 23
7 ls 54
13 ww 12
5 zl 76
8 xw 23
12 xm 43
17 dy 21

select id,name from user where name = 'zs';

能够命中name索引,索引叶子节点存储了主键id,通过name的索引树即可获取id和name,无需回表,符合索引覆盖,效率较高。

select id,name,age from user where name = 'zs';

能够命中name索引,索引叶子节点存储了主键id,但age字段必须回表查询才能获取到,不符合索引覆盖,需要再次通过id值扫码聚集索引获取age字段,效率会降低。  

结论:那怎么做才能避免回表呢?很简单,将单列索引(name)升级为联合索引(name,age).

总结

到此这篇关于mysql利用覆盖索引避免回表优化查询的文章就介绍到这了,更多相关mysql覆盖索引避免回表优化查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mac下mysql 5.7.17 安装配置方法图文教程

    Mac下mysql 5.7.17 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.17 源码编译安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • mysql 8.0.17 winx64(附加navicat)手动配置版安装教程图解

    mysql 8.0.17 winx64(附加navicat)手动配置版安装教程图解

    这篇文章主要介绍了mysql 8.0.17 winx64(附加navicat)手动配置版安装教程图解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • MySQL三种安装方法(yum安装、编译安装、二进制安装)

    MySQL三种安装方法(yum安装、编译安装、二进制安装)

    本文主要介绍了MySQL三种安装方法,包含yum安装、编译安装、二进制安装这三种,文中通过示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • MySQL主从复制不一致的原因分析以及解决

    MySQL主从复制不一致的原因分析以及解决

    这篇文章主要介绍了MySQL主从复制不一致的原因分析以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Centos6.4编译安装mysql 8.0.0 详细教程

    Centos6.4编译安装mysql 8.0.0 详细教程

    这篇文章主要为大家分享了Centos6.4编译安装mysql 8.0.0 详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • MySQL中开启和使用通用查询日志的实例教程

    MySQL中开启和使用通用查询日志的实例教程

    这篇文章主要介绍了MySQL中开启和使用通用查询日志的实例教程,包括其备份和关闭等基础操作的例子讲解,需要的朋友可以参考下
    2015-12-12
  • 一篇文章带你了解MySQL数据库约束

    一篇文章带你了解MySQL数据库约束

    数据库中要管理很多数据,但是这些数据是否正确、是否非法,光靠人力来检验是远远不够的,因此我们想让数据库拥有丰富的检验和校验能力,所以便引入了约束,下面这篇文章主要给大家介绍了关于MySQL数据库约束的相关资料,需要的朋友可以参考下
    2023-06-06
  • MySQL数据库使用mysqldump导出数据详解

    MySQL数据库使用mysqldump导出数据详解

    mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。接下来通过本文给大家介绍MySQL数据库使用mysqldump导出数据详解,需要的朋友一起学习吧
    2016-04-04
  • 本机连接虚拟机MYSQL的操作指南

    本机连接虚拟机MYSQL的操作指南

    要让本机(主机)连接到虚拟机上的 MySQL 数据库,你需要确保虚拟机和主机之间的网络连接正常,并且 MySQL 配置允许外部连接,本文给大家介绍了本机连接虚拟机MYSQL的操作指南,需要的朋友可以参考下
    2024-12-12
  • Mysql使用简单教程(二)

    Mysql使用简单教程(二)

    这篇文章主要介绍了Mysql使用简单教程(二)的相关资料,需要的朋友可以参考下
    2016-05-05

最新评论