2025-12-06 MySQL

MySQL:innodb引擎优点,索引结构B+树优点,联合索引:索引下推,索引覆盖,回表
https://www.bilibili.com/video/BV1ZX4y1n71c?spm_id_from=333.788.videopod.sections&vd_source=ed89f81ec70f5a5933f8a8a3b71dbcc0
MySQL 采用 B+树作为索引的数据结构,相比其他数据结构(如哈希、B树、二叉树等),B+树在数据库场景中有显著优势:

  1. 高效的磁盘 I/O 性能
    B+树通过多路平衡树设计,使得树的高度很低(通常3-4层就能存储千万级数据)。

sql
-- 假设每页16KB,每个索引项16字节
-- 3层B+树可存储:
-- 根节点:1024个子节点
-- 中间节点:1024×1024 = 1,048,576个叶子节点
-- 叶子节点:每页约1000条记录,共10亿条记录
优势:

减少磁盘 I/O 次数(查找记录只需3-4次磁盘访问)

充分利用磁盘预读特性(每次读取一页16KB数据)

  1. 适合范围查询
    B+树的所有数据都存储在叶子节点,且叶子节点通过指针连接成双向链表。

sql
-- 范围查询示例
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
执行过程:

找到 age=20 的起始位置

沿着叶子节点链表顺序读取,直到 age>30

不需要回溯到上层节点

优势:

范围查询效率极高(O(log n) + O(k),k为结果数量)

避免B树需要在中层节点来回跳跃的问题

  1. 稳定的查询性能
    B+树的所有查询都要走到叶子节点,因此查询路径长度相同。

text
B+树查询:根→中间→叶子(固定长度)
B树查询:可能在任意层结束(长度不定)
优势:

查询性能稳定,时间复杂度始终为 O(log n)

避免B树查询时间波动大的问题

  1. 更高的空间利用率
    B+树的非叶子节点只存储索引键值,不存储实际数据。

sql
-- 比较B树和B+树的节点结构
B树节点: [指针|键值|数据|指针|键值|数据|...]
B+树节点:[指针|键值|指针|键值|...] (非叶子节点)
[键值|数据|键值|数据|...] (叶子节点)
优势:

非叶子节点能存储更多键值,降低树的高度

一页(16KB)能容纳更多索引项

  1. 支持全表扫描和排序
    由于叶子节点组成有序链表,B+树天然支持顺序访问。

sql
-- 这些操作都很高效
SELECT * FROM users ORDER BY id; -- 按主键排序
SELECT * FROM users; -- 全表扫描
SELECT MAX(salary) FROM employees; -- 取最大值(直接到最右叶子)
优势:

避免额外的排序操作

全表扫描只需遍历叶子链表

  1. 适合数据库的读写比例
    数据库通常是读多写少的场景,B+树优化了读操作。

操作类型 B+树优势
查询 稳定的 O(log n) 复杂度
范围查询 极佳的链表遍历性能
插入/删除 平衡树结构,维护成本可接受

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容