在数据库开发与优化中,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查看执行计划,验证索引是否生效。
到此这篇关于四大核心维度带你系统梳理mysql索引的分类逻辑的文章就介绍到这了,更多相关mysql索引内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论