MySQL索引全解析:四大核心维度掌握,查询性能提升立竿见影
在数据库开发与优化中,MySQL 索引是绕不开的核心话题。很多开发者面对“慢查询”束手无策,其实问题根源往往就在于索引没建对、没用好。本文将从四大核心维度系统梳理 MySQL 索引的分类逻辑,帮助你快速构建清晰认知框架,真正做到“知其然,更知其所以然”,让查询优化少走 90% 的弯路。
一、按功能特性分类(最贴近业务开发)
这是开发者日常接触最多的分类方式,直接决定你该为哪些字段建哪种索引。
1. 主键索引(Primary Key Index)
-
特点:唯一、非空、每表仅一个;自动创建聚簇索引(InnoDB)。
-
作用:唯一标识每一行记录。
-
示例:
CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) );
2. 唯一索引(Unique Index)
-
特点:值唯一(允许多个 NULL),可多个;用于业务唯一性约束。
-
适用场景:手机号、邮箱等需去重但非主键的字段。
-
示例:
CREATE UNIQUE INDEX idx_user_phone ON user(phone);
3. 普通索引(Normal/Index)
-
特点:无约束,仅加速查询;最常用。
-
适用场景:经常出现在 WHERE、JOIN、ORDER BY 中的字段。
-
示例:
CREATE INDEX idx_user_name ON user(name);
4. 全文索引(Full-Text Index)
-
特点:支持
MATCH ... AGAINST全文检索;适用于CHAR/VARCHAR/TEXT。 -
注意:
LIKE '%关键词%'无法使用 B+Tree 索引,此时全文索引是唯一解。 -
示例:
CREATE FULLTEXT INDEX idx_article_content ON article(content);
5. 组合索引(Composite / 联合索引)
-
特点:多个字段组成一个索引;遵循最左前缀原则。
-
优势:减少索引数量,提升多条件查询效率。
-
示例:
CREATE INDEX idx_user_age_name ON user(age, name); -- 可加速 WHERE age=25 AND name='张三' -- 也可加速 WHERE age=25(但不能加速仅 WHERE name='张三')
二、按底层数据结构分类(决定性能本质)
索引的本质是数据结构,不同结构适合不同查询模式。
1. B+Tree 索引(默认且最主流)
-
引擎支持:InnoDB、MyISAM 默认使用。
-
优势:
- 支持范围查询(
>,<,BETWEEN) - 支持排序(
ORDER BY) - 磁盘 IO 少,查询稳定高效
- 支持范围查询(
-
适用场景:90% 以上的业务查询。
2. Hash 索引
-
引擎限制:Memory 引擎原生支持;InnoDB 有自适应 Hash 索引(不可手动创建)。
-
优势:等值查询(
=、IN)极快,O(1) 时间复杂度。 -
劣势:
- 不支持范围、排序、模糊查询
- 哈希冲突时性能骤降
-
适用场景:内存表中的精确匹配高频查询。
3. 空间索引(R-Tree)
- 支持类型:
POINT、LINESTRING、POLYGON等地理数据。 - 引擎支持:MyISAM、InnoDB(5.7+)。
- 用途:GIS 应用,如“附近 5 公里内的商家”。
4. 全文索引(倒排索引结构)
- 底层:基于分词的倒排索引(类似搜索引擎)。
- 注意:与 B+Tree 全文索引不同,需用
MATCH ... AGAINST语法。
三、按物理存储方式分类(影响 I/O 效率)
1. 聚簇索引(Clustered Index)
- 特点:索引即数据,叶子节点直接存储整行数据。
- InnoDB 规则:主键索引 = 聚簇索引;若无主键,InnoDB 自动生成隐藏聚簇索引。
- 优势:主键查询只需一次 I/O。
- 注意:一张表只能有一个聚簇索引。
2. 非聚簇索引(Secondary Index / 二级索引)
- 特点:叶子节点存储的是主键值(InnoDB)或行指针(MyISAM)。
- 查询过程:先查二级索引 → 再回表查聚簇索引(“回表查询”)。
- 优化建议:尽量使用覆盖索引(SELECT 字段都在索引中),避免回表。
四、按字段数量分类(设计索引时的关键考量)
| 类型 | 说明 | 注意事项 |
|---|---|---|
| 单列索引 | 仅包含一个字段 | 简单直接,但可能冗余 |
| 组合索引 | 包含 2~16 个字段(InnoDB 最多 16 列) | 遵循最左前缀,合理排序字段顺序可大幅提升复用率 |
✅ 最佳实践:将区分度高、查询频率高的字段放组合索引左侧。
总结:如何科学建索引?
- 主键必设:使用自增整数主键,避免随机 UUID 导致页分裂。
- 高频查询字段加普通索引:如状态、类型、时间等。
- 唯一性字段用唯一索引:如手机号、订单号。
- 多条件查询优先考虑组合索引:避免建多个单列索引。
- 警惕索引失效:函数操作、隐式类型转换、
OR条件不当等都会导致索引失效。 - 定期分析慢查询日志:用
EXPLAIN查看执行计划,验证索引是否生效。