当前位置: 首页 > news >正文

B树与B+树核心差异深度解析

一、B 树与 B + 树核心差异对比

对比维度B 树B + 树
数据存储位置非叶子节点、叶子节点均存储数据(关键字 + 数据 / 指针)仅叶子节点存储完整数据,非叶子节点仅存索引(关键字 + 子节点指针)
查询性能查询可能终止于非叶子节点,查询时间不稳定(IO 次数不固定)所有查询均需到叶子节点,查询时间稳定(IO 次数固定)
范围查询支持需遍历整棵树查找相邻数据,效率低叶子节点通过双向链表串联,直接顺序读取,效率极高
空间利用率非叶子节点存数据,相同空间存储索引更少,树高更高非叶子节点无数据,相同空间存储更多索引,树高更矮(减少 IO)
数据冗余情况无冗余,数据仅存储一次有冗余,非叶子节点是索引冗余,叶子节点包含所有数据
插入删除复杂度可能涉及非叶子节点数据移动,调整复杂仅操作叶子节点,调整简单,稳定性更高
适用场景文件系统、大尺寸数据块随机访问场景关系型数据库主键 / 二级索引(MySQL、Oracle)

二、MySQL 中 B + 树索引的落地实现(InnoDB 存储引擎)

核心前提:InnoDB 的 “索引即数据” 特性

InnoDB 中,聚簇索引的叶子节点就是数据本身,表数据按聚簇索引的顺序物理存储(索引与数据一体化),这是 B + 树在数据库中落地的关键优化,完美契合 B + 树 “高效查询、范围遍历” 的核心优势。

(一)聚簇索引(Clustered Index:主键索引)

1. 结构设计(基于 B + 树)
  • 非叶子节点:存储「主键值 + 子节点指针」(仅索引,无数据);
  • 叶子节点:存储「完整行数据」(主键值 + 其他所有字段值);
  • 所有叶子节点通过双向链表串联(适配范围查询)。
2. 创建规则
  • 优先使用显式定义的主键作为聚簇索引;
  • 若无主键,选择非空唯一索引(UNIQUE NOT NULL) 替代;
  • 若既无主键也无非空唯一索引,InnoDB 隐式创建 6 字节自增row_id作为聚簇索引。
3. 查询逻辑(高效无回表)
  • 主键单点查询:通过 B + 树直接定位到叶子节点,一次 IO 拿到完整数据;
  • 范围查询:找到起始叶子节点后,通过双向链表遍历所有符合条件的数据(如WHERE id BETWEEN 100 AND 200)。
4. 示例(表结构 + 索引示意)

sql

CREATE TABLE user (id INT PRIMARY KEY,  -- 聚簇索引name VARCHAR(50),age INT
);

索引结构示意:

plaintext

非叶子节点(索引层):[10]→子节点指针 | [20]→子节点指针 | [30]→子节点指针
叶子节点(数据层):[10, "张三", 25] ←→ [20, "李四", 30] ←→ [30, "王五", 28] (双向链表)

(二)非聚簇索引(Secondary Index:二级索引)

1. 结构设计(基于 B + 树)
  • 非叶子节点:存储「索引列值 + 子节点指针」(仅索引,无数据);
  • 叶子节点:存储「索引列值 + 聚簇索引值(主键值)」(非完整数据,仅存关联主键);
  • 叶子节点同样通过双向链表串联。
2. 核心特点:回表查询(除非覆盖索引)

非聚簇索引叶子节点不存完整数据,查询需两步:

  1. 通过非聚簇索引找到对应的「主键值」(索引查询);
  2. 再通过聚簇索引(主键)找到完整行数据(回表查询)。
3. 查询逻辑(示例)

基于上述user表创建二级索引:

sql

CREATE INDEX idx_age ON user(age);  -- 非聚簇索引

索引结构示意:

plaintext

非叶子节点(索引层):[25]→子节点指针 | [28]→子节点指针 | [30]→子节点指针
叶子节点(索引+主键层):[25, 10] ←→ [28, 30] ←→ [30, 20] (双向链表)

查询示例SELECT * FROM user WHERE age = 25;

  1. 通过idx_age找到age=25对应的主键值10
  2. 通过聚簇索引id=10定位到叶子节点,获取完整数据[10, "张三", 25]
  3. 若查询SELECT id, age FROM user WHERE age=25(仅索引列 + 主键),无需回表(覆盖索引)。

(三)聚簇索引 vs 非聚簇索引对比

对比维度聚簇索引(主键索引)非聚簇索引(二级索引)
叶子节点存储完整行数据(索引 + 数据一体化)索引列值 + 主键值(仅索引关联)
查询效率高(直接拿数据,无需回表)较低(需回表,覆盖索引除外)
数量限制一张表仅 1 个(InnoDB 核心索引)一张表可多个(按需创建)
数据物理存储按聚簇索引顺序物理存储不影响数据物理存储(独立索引结构)
适用场景主键查询、范围查询非主键字段过滤查询(如WHERE age=25

三、MySQL 索引实战优化建议

  1. 主键设计:用自增 INT/BIGINT 作为主键(聚簇索引按顺序存储,减少插入时的页分裂);
  2. 二级索引:仅对高频查询字段创建,避免过多索引占用空间、拖慢插入 / 更新;
  3. 覆盖索引优先:高频查询的字段组合(如age+name)创建联合索引,避免回表(如CREATE INDEX idx_age_name ON user(age, name));
  4. 范围查询优化:优先使用主键或聚簇索引相关字段做范围查询,利用叶子节点双向链表优势。

四、核心总结

  • B + 树是 B 树的优化版,通过 “仅叶子节点存数据、叶子节点双向链表”,适配数据库 “稳定查询、高效范围查询” 需求;
  • MySQL InnoDB 以 B + 树为基础,通过 “聚簇索引 + 非聚簇索引” 架构,实现 “索引即数据” 的高效存储;
  • 聚簇索引是核心,非聚簇索引依赖聚簇索引实现数据关联,合理设计索引(如覆盖索引、自增主键)是提升查询性能的关键。
http://www.dtcms.com/a/590315.html

相关文章:

  • 11.9 脚本调试 手机网页调试参考
  • 制作网站公司网址开发公司公司简介
  • 满洲里做网站郑州企业网站价格
  • FoundationPose:统一的新物体6D姿态估计与跟踪
  • 地方志网站建设方案南京平台网站建设
  • 杭州建站模板黄岛网站建设公司
  • C语言容易被忽略的易错点(2)
  • 十堰网站建设u2028深圳住房与建设网站
  • 栖霞建设招标网站包装设计网课答案
  • 网站建设引入谷歌地图淘宝客网站虚拟主机
  • [题解]龟兔赛跑 | PTA
  • 禁闭求生2/Grounded 2|网络联机|30GB|简体中文|支持多种操作设备
  • 网站开发流行语言php网站开发实训指导书
  • 百科类网站建设静态网站开发课程相关新闻
  • 我与C++的故事
  • HTML 段落
  • 国外网站无法访问企业网站备案名称
  • 建设网上银行官方网站起飞页自助建站平台
  • Bluepine Tech Foundation 启动全球AI农业数据服务平台
  • 品牌网站建设哪里有三星网上商城app
  • 网站制作的公香河住房与建设局网站
  • 免费自助网站建设wordpress电影下载站
  • 徐州商城建站系统wordpress divi 2.5
  • 电影网站做seo公司建网站 内部邮箱
  • 什么语言网站比较安全三亚推广公司
  • python做笔记的网站宿迁房产网安居客
  • 王建设个人网站百度网站免费优化软件下载
  • 关于电商商品卡片布局的代码详细解析
  • 如网站站长如何对付黑客seo的基本步骤是什么
  • 【完整源码+数据集】高空作业数据集,yolo高空作业检测数据集 2076 张,人员高空作业数据集,目标检测高空作业识别系统实战教程