学习目标
了解索引的基本概念,掌握除索引外使用的数据结构,深入理解 B+ 树在索引中的应用,并熟悉索引的分类与使用场景。
索引基础
什么是索引?
MySQL 的索引本质上是一种数据结构,用于帮助数据库高效地查询、更新数据表中的记录。它通过特定的规则排列数据,使得对表的查询可以通过搜索索引来加速,类似于书籍的目录或汉语字典的检索页,能让我们按笔画、拼音等快速定位目标内容。
为什么要用索引?
核心目的只有一个:提升检索效率。在实际应用中,查询操作的频率往往远高于增删改操作,因此优化查询路径至关重要。
索引的数据结构选型
HASH
HASH 的时间复杂度是 O(1),查询速度极快,但 MySQL 并未将其作为默认索引结构,主要原因是 HASH 不支持范围查找。
二叉搜索树
虽然二叉搜索树的中序遍历是有序的,但它存在明显缺陷:最坏情况下时间复杂度为 O(N),且节点过多时难以保证树高。AVL 和红黑树虽经过平衡处理,但仍是二叉结构。在数据库系统中,磁盘 IO 是性能瓶颈,每次访问子节点都会产生一次 IO,减少 IO 次数才是关键。
N 叉树
为降低树高,N 叉树是一个方向。相同数据量下,N 叉树的树高能得到有效控制,从而减少 IO 次数。不过 MySQL 认为这还不够理想。

B+ 树
简介
B+ 树是数据库和文件系统中常用的平衡查找树,也是 MySQL InnoDB 引擎采用的索引结构。以 4 阶 B+ 树为例:

特点
- 保持数据稳定有序,插入与修改有较稳定的时间复杂度。
- 非叶子节点仅存索引,不存数据;所有真实数据存储在叶子节点。
- 所有叶子节点构成有序链表,可按 Key 排序依次遍历全部数据。
与 B 树对比
- 叶子节点数据连续且相互链接,便于区间查找。
- 非叶子节点的值都包含在叶子节点中。
- 相同树高下,查找任一元素的时间复杂度一致,性能均衡。
MySQL 中的页
页(Page)机制
在 .ibd 文件中,Page 是内存与磁盘交互的最小单元,默认大小为 16KB。根据局部性原理,程序执行时访问的数据大概率在空间上临近,因此一次读取一页放入内存,后续若数据仍在页内可直接从内存读取,减少磁盘 I/O。
查看页大小可通过系统变量 innodb_page_size:
mysql> SHOW VARIABLES LIKE 'innodb_page_size';
+------------------+-------+
| Variable_name
innodb_page_size









