MySQL --索引
一、索引概述
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
二、索引结构

索引结构的选择
假如说MySQL的索引结构采用二叉树的数据结构,比较理想的结构(满二叉树或完全二叉树)如下:

如果主键是顺序插入的,则会形成一个单向链表,结构如下:

所以,如果选择二叉树作为索引结构,会存在以下缺点:
- 顺序插入时会形成一个链表,查询性能大大下降
- 大量数据下,层级越深,检索速度越慢
此时大家可能会想到,我们可以选择红黑树,红黑树是一颗自平衡二叉树,那这样即使是顺序插入数
据,最终形成的数据结构也是一颗平衡的二叉树,结构如下:

但是,即使如此,由于红黑树也是一颗二叉树,所以也会存在一个缺点:
- 大量数据下,层级越深,检索速度慢
所以,在MySQL的索引结构中,并没有选择二叉树或者红黑树,而选择的是B+Tree。
三、B-Tree,B+Tree Hash
B-Tree
介绍:
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5个指针:

特点:
- m阶的B-Tree,每一个节点最多存储 m-1 个Key,对应m个指针
- 一旦节点存储的Key达到m,就会裂变,中间元素向上裂变
- 在B树中,非叶子节点和叶子节点都会存储数据
B+Tree
介绍:
B+Tree是B-Tree的变种,我们以一颗最大度数(max-degree)为4(4阶)的b+tree为例,来看一下其结构示意图:
我们可以看到,两部分:
- 绿色框框起来的部分,是索引部分,仅仅起到索引数据的部分,不存储数据
- 红色框框起来的部分,是数据存储部分,在其叶子节点中存储具体的数据
特点:
- 所以数据都会存储在叶子节点
- 叶子节点形成一个单向链表
- 非叶子节点仅仅起到索引数据的作用,具体数据都在叶子节点存放
上述我们所看到的结构是标准的B+Tree的数据结构,接下来,我们再来看看MySQL中优化之后的B+Tree。
MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。

Hash
介绍:
哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中

特点:
- Hash只能用于对等比较(=,in),不支持范围查询(between,<,>等)
- 无法利用索引完成排序操作
- 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引
四、索引分类
在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。

五、聚集索引和二级索引
而在在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

聚集索引选取规则:
- 如果存在主键,主键索引就是聚集索引
- 如果不存在主键,就会使用第一个唯一索引作为聚集索引
- 如果表中没有主键,也没有合适的位于索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引
聚集索引和二级索引的具体结构如下:

- 聚集索引的叶子节点下挂的是这一行的数据
- 二级索引的叶子节点挂的是该字段值对应的主键
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧