侧边栏壁纸
博主头像
月伴飞鱼 博主等级

行动起来,活在当下

  • 累计撰写 39 篇文章
  • 累计创建 25 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

MySQL叶子节点的每条记录之间是如何关联的?

月伴飞鱼
2025-03-09 / 0 评论 / 1 点赞 / 6 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在 MySQL 中,叶子节点通常是指 B+ 树索引结构中的叶子节点。

B+ 树作为一种平衡的多路查找树,广泛用于 MySQL 的索引结构(尤其是 InnoDB 存储引擎),它通过多层次的索引树来提高查询性能。

1. B+ 树索引结构

B+ 树索引由两部分组成:

  • 非叶子节点:用于存储索引的键(key),但不直接存储数据。它们的作用是加速查找过程。

  • 叶子节点:存储实际的记录数据(或数据行的指针)。对于聚簇索引(InnoDB 默认索引),叶子节点包含完整的行数据;对于二级索引(非聚簇索引),叶子节点则存储指向聚簇索引的引用(即主键)。

2. 叶子节点记录之间的关联方式

B+ 树的叶子节点之间通常通过链表连接。这种链表连接使得叶子节点之间可以顺序访问,对于范围查询(如 BETWEEN 查询)特别高效。具体来说,叶子节点的每条记录之间的关联方式如下:

(1) 顺序链表连接

  • 叶子节点中的每条记录包含了一个指向下一个叶子节点的指针。这些指针将叶子节点按索引键的顺序串联起来,形成一个顺序链表

  • 顺序访问:通过这个链表,MySQL 可以高效地执行范围查询(如检索一段连续的数据),直接从当前叶子节点跳到下一个叶子节点,而无需重新遍历整个树结构。

    举个例子,假设有以下数据:

    叶子节点1: (1, data1), (2, data2), (3, data3)
    叶子节点2: (4, data4), (5, data5), (6, data6)

    其中,叶子节点1的最后一条记录 (3, data3) 会指向叶子节点2的第一条记录 (4, data4)。这种链表式的连接使得扫描操作可以顺序执行。

(2) 指向数据行的指针(聚簇索引)

  • 对于聚簇索引(InnoDB 默认索引),叶子节点中的每条记录存储的是整行数据,或者说是指向数据行的指针。在这种情况下,数据的存储与索引的存储是紧密绑定在一起的,索引的叶子节点不仅存储索引值,还存储完整的数据行。

    非聚簇索引中,叶子节点只存储主键的值(作为索引值),并且通过该主键值指向聚簇索引(主键索引)中的数据。

3. 多级链表与双向链表

在某些实现中,叶子节点之间的链表可能是双向链表,即每个叶子节点不仅有指向下一个叶子节点的指针,还可能有指向上一个叶子节点的指针。

这对于倒序扫描等操作也非常有用,可以使得范围查询更加灵活和高效。

4. 范围查询的优化

B+ 树叶子节点的链表结构对于范围查询非常有利。

例如,当你执行一个 SELECT * FROM table WHERE column BETWEEN X AND Y 查询时,MySQL 可以:

  • 通过索引查找到符合条件的第一个叶子节点。

  • 然后利用叶子节点之间的顺序链表连接顺序地扫描下去,直到满足查询条件的最后一个叶子节点。

这种顺序访问比传统的逐条扫描表中的记录要高效得多。

5. 总结

  • 叶子节点的记录之间通过链表连接,这种连接是顺序的,使得范围查询非常高效。

  • 双向链表的实现可能会用于进一步优化查询,如支持倒序扫描。

  • 聚簇索引的叶子节点直接存储数据行,而非聚簇索引的叶子节点存储主键的引用,指向聚簇索引中的实际数据。

这种结构使得 B+ 树能够高效地执行范围查询和其他各种查询操作,同时保证了数据库在插入、删除、更新数据时的平衡性和高性能。

公众号.png

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
    1. 支付宝打赏

      qrcode alipay
    2. 微信打赏

      qrcode weixin
博主关闭了所有页面的评论