一、索引核心定义与优缺点
定义 :索引是帮助 MySQL 高效获取数据的有序数据结构,通过额外维护的数据结构引用数据,实现快速查找。
表格
| 优势 | 劣势 |
|---|---|
| 提升检索效率,降低数据库 I/O 成本 | 占用额外存储空间 |
| 降低数据排序成本与 CPU 消耗 | 降低 INSERT/UPDATE/DELETE 等更新操作的效率 |
二、索引分类
1. 逻辑分类
表格
| 分类 | 含义 | 特点 | 关键字 |
|---|---|---|---|
| 主键索引 | 针对表主键创建的索引 | 默认自动创建,仅能有一个 | PRIMARY |
| 唯一索引 | 避免列值重复 | 可存在多个 | UNIQUE |
| 常规索引 | 快速定位数据 | 可存在多个 | - |
| 全文索引 | 匹配文本关键词 | 可存在多个 | FULLTEXT |
2. InnoDB 存储形式分类
表格
| 分类 | 含义 | 特点 |
|---|---|---|
| 聚集索引 | 数据与索引存储在一起,叶子节点保存完整行数据 | 必须有且仅有一个 |
| 二级索引 | 数据与索引分离,叶子节点关联主键 | 可存在多个 |
聚集索引选取规则:
- 有主键 → 主键索引即聚集索引
- 无主键 → 取第一个唯一索引作为聚集索引
- 无主键且无合适唯一索引 → InnoDB 自动生成隐藏
rowid作为聚集索引
三、主流索引结构
1. B+Tree(MySQL 核心索引结构)
- 结构特征 :
- 最大度数为 4(4 阶)的 B+Tree 中,每个节点最多存储 3 个键值、4 个指针
- 所有数据存储在叶子节点,非叶子节点仅存导航键值
- 叶子节点通过双向链表连接,支持高效范围查询与排序
- 与 B-Tree 区别 :
- 所有数据均在叶子节点,B-Tree 数据可分布在任意节点
- 叶子节点形成有序链表,区间访问性能更优
2. Hash 索引
- 实现:通过哈希算法将键值映射到哈希表,冲突用链表解决
- 特点 :
- 仅支持等值查询(
=、IN),不支持范围查询 - 无法利用索引完成排序
- 查询效率通常高于 B+Tree,单次检索即可定位数据
- 仅支持等值查询(
- 引擎支持 :
- Memory 引擎原生支持
- InnoDB 引擎提供自适应 Hash 功能,基于 B+Tree 自动构建
3. 其他索引结构
表格
| 类型 | 描述 | 适用场景 |
|---|---|---|
| R-tree | MyISAM 专属空间索引 | 地理空间数据类型 |
| Full-text | 倒排索引实现 | 全文检索场景 |
四、存储引擎对索引的支持
表格
| 索引类型 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| B+Tree | 支持 | 支持 | 支持 |
| Hash | 自适应支持 | 不支持 | 原生支持 |
| R-tree | 不支持 | 支持 | 不支持 |
| Full-text | 5.6+ 支持 | 支持 | 不支持 |