• 什么是MySQL的回表?


    文章目录

    引言

    简单来说,回表就是 MySQL 要先查询到主键索引,然后再用主键索引定位到数据。

    下面,对一些问题进行分析与回答:

    • 什么是聚簇索引?什么是非聚簇索引?
    • 为什么回表要先查到主键索引?
    • 主键索引和非主键索引有什么区别?
    • 如何避免回表?

    聚簇索引和非聚簇索引是什么?

    MySQL 的索引有不同的角度的分类方式,例如:按数据结构分、按逻辑角度分、按物理存储分。

    其中,按物理存储分有两种索引:聚簇索引非聚簇索引

    简单来说,聚簇索引是主键索引

    主键索引之外的就是非聚簇索引,非聚簇索引又叫辅助索引或者二级索引。

    主键索引和非主键索引有什么区别?

    相同点:都使用的是 B+Tree 。

    不同点:叶子节点存储的数据不同

    • 主键索引的叶子节点存储的是一行完整的数据
    • 非主键索引的叶子节点存储的是主键值。叶子节点不包含记录的全部数据,非主键的叶子节点除了用来排序的 key 还包含一个书签(bookmark),其中存储了聚簇索引的 key。

    那么这两种索引在使用方面上有什么区别呢?

    1. 使用主键索引查询

      # 主键索引的的叶子节点存储的是**一行完整的数据**,
      # 所以只需搜索主键索引的 B+Tree 就可以轻松找到全部数据
      select * from user where id = 1;
      
      • 1
      • 2
      • 3
    2. 使用非主键索引查询

      # 非主键索引的叶子节点存储的是**主键值**,
      # 所以MySQL会先查询到 name 列的索引的 B+Tree,搜索得到对应的主键值
      # 然后再去搜索该主键值查询主键索引的 B+Tree 才可以找到对应的数据
      select * from user where name = 'Jack';
      
      • 1
      • 2
      • 3
      • 4

    可以看出使用非主键索引要比主键索引多使用一次 B+Tree。

    B-Tree 和 B+Tree 的简单理解

    理解聚簇索引和非聚簇索引的关键在于 B+Tree 的理解。

    用一幅图来表示,其它的就不再过多解释了:

    https://gitee.com/littlefxc/oss/raw/master/images/KjXSSU.jpg

    这里只是简单介绍一下 B-Tree 和 B+Tree 的区别:

    1. B+树中只有叶子节点会带有指向记录的指针,而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
    2. B+树中所有叶子节点都是通过指针连接在一起,而B树不会。

    如何避免回表?

    使用覆盖索引,所谓覆盖索引就是指索引中包含了查询中的所有字段,这种情况下就不需要再进行回表查询了。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    [附源码]java毕业设计零食销售系统
    C#海康相机SDK二次开发——网口及USB3.0接口的工业相机
    SpringCloud Alibaba微服务实战五 - 配置隔离
    【深度学习】(三)图像分类
    vb.net自定义白板
    HTML、CSS学习笔记小结
    jq实现多页展示并且进度条轮播
    Go 使用环境变量
    如何计算 R 中的基尼系数(附示例)
    Unity编辑器拓展最全实现
  • 原文地址:https://blog.csdn.net/m0_67403073/article/details/126080893