MySQL索引类型详解
AI-摘要
ikun GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
MySQL索引类型详解
xukunMySQL 索引类型详解
索引是数据库优化的核心手段,理解不同索引类型的特点和适用场景,是写出高性能 SQL 的关键。
一、索引分类总览
| 分类维度 | 索引类型 |
|---|---|
| 数据结构 | B+Tree、Hash、Full-Text、R-Tree |
| 存储方式 | 聚簇索引、非聚簇索引 |
| 物理层级 | 主键索引、二级索引(辅助索引) |
| 索引性质 | 主键索引、唯一索引、普通索引、前缀索引 |
| 字段个数 | 单列索引、联合索引(复合索引) |
二、按数据结构分类
2.1 B+Tree 索引(默认)
MySQL 中最常用的索引类型,InnoDB 和 MyISAM 都基于 B+Tree 实现。
B+Tree 特点:
- 非叶子节点只存储 key 和指针,不存储数据
- 叶子节点存储所有 key 和数据,并通过双向链表连接
- 支持范围查询和排序
1 | -- 创建 B+Tree 索引(默认) |
2.2 Hash 索引
基于哈希表实现,等值查询 O(1) 复杂度。
| 优点 | 缺点 |
|---|---|
| 等值查询极快 | 不支持范围查询 |
| 结构简单 | 不支持排序 |
| 存在哈希冲突 |
注意:InnoDB 不支持显式创建 Hash 索引,但内部有自适应哈希索引(Adaptive Hash Index)。
2.3 全文索引(Full-Text)
对文本内容进行分词搜索,支持 CHAR、VARCHAR、TEXT 类型。
1 | -- 创建全文索引 |
实际应用:生产环境通常使用 Elasticsearch 替代 MySQL 全文索引。
2.4 R-Tree 索引
用于空间数据类型(geometry),支持地理位置的范围查询,使用较少。
三、按存储方式分类
3.1 聚簇索引 vs 非聚簇索引
| 特性 | 聚簇索引 | 非聚簇索引 |
|---|---|---|
| 数据存储 | 索引和数据存储在一起 | 索引和数据分开存储 |
| 叶子节点 | 存储完整行数据 | 存储主键值 |
| 每表数量 | 只能有一个 | 可以有多个 |
| 查询方式 | 直接获取数据 | 需要回表查询 |
| 典型实现 | InnoDB 主键索引 | InnoDB 二级索引、MyISAM 所有索引 |
回表查询流程:
1 | 二级索引 → 找到主键值 → 主键索引 → 获取完整数据 |
3.2 覆盖索引
当查询的字段都包含在索引中时,无需回表,称为索引覆盖。
1 | -- 假设有联合索引 (name, age) |
四、按索引性质分类
| 索引类型 | 特点 | 创建语法 |
|---|---|---|
| 主键索引 | 唯一 + 非空 + 每表一个 | PRIMARY KEY |
| 唯一索引 | 列值唯一,允许 NULL | UNIQUE INDEX |
| 普通索引 | 仅加速查询 | INDEX |
| 前缀索引 | 只索引前 N 个字符,节省空间 | INDEX(col(N)) |
1 | -- 前缀索引示例 |
五、联合索引与最左前缀
5.1 联合索引结构
1 | CREATE INDEX idx_abc ON t(a, b, c); |
联合索引按照 (a, b, c) 的顺序排序,遵循最左前缀原则。
5.2 最左前缀匹配
| 查询条件 | 是否走索引 | 说明 |
|---|---|---|
WHERE a = 1 | ✅ | 使用 a |
WHERE a = 1 AND b = 2 | ✅ | 使用 a, b |
WHERE a = 1 AND b = 2 AND c = 3 | ✅ | 使用 a, b, c |
WHERE b = 2 | ❌ | 缺少最左列 a |
WHERE a = 1 AND c = 3 | ⚠️ | 只使用 a,c 无法使用 |
WHERE a > 1 AND b = 2 | ⚠️ | a 使用范围查询后,b 失效 |
六、MySQL 8.x 索引新特性
6.1 隐藏索引
索引存在但优化器不使用,用于测试删除索引的影响。
1 | -- 创建隐藏索引 |
6.2 降序索引
MySQL 8.0 开始真正支持降序索引。
1 | -- 创建降序索引 |
6.3 函数索引
支持对表达式或函数结果建立索引。
1 | -- 对 UPPER(name) 建立索引 |
七、索引使用建议
- 选择性高的列优先建索引:如用户 ID、订单号
- 避免过多索引:每个索引都需要维护,影响写入性能
- 联合索引优于多个单列索引:减少回表次数
- 长字符串使用前缀索引:节省空间
- 避免在索引列上使用函数:会导致索引失效(8.0 可用函数索引)
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果











