14.MySQL索引底层原理:从数据结构到B+树的深度解析

目录

开篇:索引是什么?为什么需要它?

候选数据结构:为什么选B+树?

[1. 二叉搜索树(及变种:AVL、红黑树)](#1. 二叉搜索树(及变种:AVL、红黑树))

[2. 哈希表](#2. 哈希表)

[3. B树(N叉搜索树)](#3. B树(N叉搜索树))

[4. B+树(索引的核心数据结构)](#4. B+树(索引的核心数据结构))

[B+树 vs B树:优势在哪里?](#B+树 vs B树:优势在哪里?)

MySQL中的"页(page)":索引的物理载体

高频面试题回顾

总结


开篇:索引是什么?为什么需要它?

索引相当于书的目录 ,核心作用是加快查询速度。但索引并非"免费午餐",它有代价:

  • 消耗额外存储空间;

  • 可能拖慢增删改速度(因为删除/修改常搭配where条件,若where能走索引查询,索引维护会有开销)。

通常索引利大于弊 :存储成本(硬盘便宜)不是核心矛盾;实际开发中读频率远高于写频率(比如"作业表"场景:同学查看作业是读操作,写入记录是写操作,读远多于写)。

候选数据结构:为什么选B+树?

索引需要高效的数据结构,我们逐一分析常见结构:

1. 二叉搜索树(及变种:AVL、红黑树)

  • 二叉搜索树:查找时间复杂度平均O(logN) ,但最坏O(N)(退化成链表)。

  • AVL树:要求严格平衡(任何节点左右子树高度差≤1),查询快,但插入/删除需频繁调整树结构,开销大。

  • 红黑树:做了权衡,不要求严格平衡,把查询稍慢一点(几乎感知不到),换取插入/删除效率提升。

但二叉搜索树(包括AVL、红黑树)作为索引的问题:树高过高(元素多时),IO访问次数多(数据库从硬盘读数据,IO是瓶颈)。

2. 哈希表

哈希表查找时间复杂度O(1),但缺陷明显:

  • 仅支持相等条件查询 (如=),不支持范围查询(< >)、模糊匹配;

  • hash函数将key转为数组下标,无法利用数据的"有序性"。

3. B树(N叉搜索树)

B树是多叉搜索树,改进了二叉树的树高问题:

  • 每个节点存N个值,划分N+1个区间;

  • 一次IO操作可读取一个节点,拿到N个key比较,减少IO次数。

但B树仍有不足,于是有了B+树(索引的专属数据结构)。

4. B+树(索引的核心数据结构)

B+树是B树的改进版,也是N叉搜索树,核心特点:

  1. 每个节点存N个值,划分N个区间,其中的最后一个元素表示当前子树的最大值;

  2. 叶子节点是数据全集 ,并通过双向链表串起来(方便范围查询);

  3. 非叶子节点只存索引key(子节点位置),叶子节点存完整数据行;

  4. 所有数据都在叶子节点,查询必须到叶子,开销稳定(比较次数相当);

  5. N叉树高度更低(比红黑树更矮),IO次数更少。

B+树 vs B树:优势在哪里?

  • 范围查询 :B+树叶子节点用双向链表连接,范围查询(如between)只需遍历链表;B树范围查询需中序遍历,效率低。

  • 空间利用:非叶子节点只存key,不存数据,更省内存,适合缓存。

  • 查询稳定:每次查询都到叶子,中间比较次数相当,开销稳定。

  • 树高更低:N叉结构让树高更矮,IO次数更少。

MySQL中的"页(page)":索引的物理载体

MySQL中,"页"是B+树上的节点:

  • 数据页 :叶子节点,存储若干数据行(如学生表的id, name, gender, age);

  • 索引页 :非叶子节点,只存key和子节点位置(也是"页")。

数据库以页为单位从硬盘读取 ,利用局部性原理(程序访问某位置数据后,大概率访问附近数据),减少IO次数。

高频面试题回顾

面试中常问:

  • 什么是索引?

  • 索引使用的什么数据结构?(答:B+树,及对比AVL、红黑树、哈希表、B树的优劣)

总结

索引的本质是用空间换时间 ,核心数据结构是B+树(兼顾查询、插入删除、范围查询、IO效率)。理解B+树的结构(多叉、叶子链表、非叶子存key),以及MySQL"页"的设计,就能掌握索引底层逻辑。

相关推荐
想带你从多云到转晴3 小时前
MySQL重点梳理
数据库·mysql
每周报刊4 小时前
竞速座舱级视界:爱攻 AGP497UCZD 超宽 QDOLED 显示器解析
数据结构·游戏·计算机外设
冰暮流星4 小时前
mysql之外键约束
数据库·mysql
betazhou6 小时前
mysql shell8.4.10+mysql 8.4.10搭建MySQL replicaset主从
数据库·mysql·ffmpeg·replicaset·mysql shell
小星星闪亮登场6 小时前
图论--最小生成树(内含二分图)
数据结构·算法·图论·迭代加深·图搜索算法
2601_962065257 小时前
2.启动mysql容器
java·数据库·mysql
2601_962201727 小时前
Java进阶,集合,Colllection,常见数据结构
java·数据结构·windows
挽星安7 小时前
2026/8/29
数据结构·算法
positive_zpc8 小时前
进阶数据结构图——最短路径(二)
数据结构·算法·图论·最短路径
positive_zpc8 小时前
进阶数据结构图——最小生成树(一)
数据结构·算法·图论