MySQL:innodb引擎优点,索引结构B+树优点,联合索引:索引下推,索引覆盖,回表
https://www.bilibili.com/video/BV1ZX4y1n71c?spm_id_from=333.788.videopod.sections&vd_source=ed89f81ec70f5a5933f8a8a3b71dbcc0
MySQL 采用 B+树作为索引的数据结构,相比其他数据结构(如哈希、B树、二叉树等),B+树在数据库场景中有显著优势:
- 高效的磁盘 I/O 性能
B+树通过多路平衡树设计,使得树的高度很低(通常3-4层就能存储千万级数据)。
sql
-- 假设每页16KB,每个索引项16字节
-- 3层B+树可存储:
-- 根节点:1024个子节点
-- 中间节点:1024×1024 = 1,048,576个叶子节点
-- 叶子节点:每页约1000条记录,共10亿条记录
优势:
减少磁盘 I/O 次数(查找记录只需3-4次磁盘访问)
充分利用磁盘预读特性(每次读取一页16KB数据)
- 适合范围查询
B+树的所有数据都存储在叶子节点,且叶子节点通过指针连接成双向链表。
sql
-- 范围查询示例
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
执行过程:
找到 age=20 的起始位置
沿着叶子节点链表顺序读取,直到 age>30
不需要回溯到上层节点
优势:
范围查询效率极高(O(log n) + O(k),k为结果数量)
避免B树需要在中层节点来回跳跃的问题
- 稳定的查询性能
B+树的所有查询都要走到叶子节点,因此查询路径长度相同。
text
B+树查询:根→中间→叶子(固定长度)
B树查询:可能在任意层结束(长度不定)
优势:
查询性能稳定,时间复杂度始终为 O(log n)
避免B树查询时间波动大的问题
- 更高的空间利用率
B+树的非叶子节点只存储索引键值,不存储实际数据。
sql
-- 比较B树和B+树的节点结构
B树节点: [指针|键值|数据|指针|键值|数据|...]
B+树节点:[指针|键值|指针|键值|...] (非叶子节点)
[键值|数据|键值|数据|...] (叶子节点)
优势:
非叶子节点能存储更多键值,降低树的高度
一页(16KB)能容纳更多索引项
- 支持全表扫描和排序
由于叶子节点组成有序链表,B+树天然支持顺序访问。
sql
-- 这些操作都很高效
SELECT * FROM users ORDER BY id; -- 按主键排序
SELECT * FROM users; -- 全表扫描
SELECT MAX(salary) FROM employees; -- 取最大值(直接到最右叶子)
优势:
避免额外的排序操作
全表扫描只需遍历叶子链表
- 适合数据库的读写比例
数据库通常是读多写少的场景,B+树优化了读操作。
操作类型 B+树优势
查询 稳定的 O(log n) 复杂度
范围查询 极佳的链表遍历性能
插入/删除 平衡树结构,维护成本可接受