前言
mysql(尤其是 innodb 引擎)支持多种索引类型,不同索引适用于不同场景。以下是 mysql 中常见的索引类型及其特点,按逻辑分类和物理结构两个维度说明:
一、按逻辑用途分类(常用)
1.主键索引(primary key)
- 唯一且非空,一张表只能有一个。
- innodb 中,主键索引就是 聚簇索引(clustered index):数据行与索引存储在一起。
- 选择原则:尽量使用自增整数(避免页分裂),避免使用 uuid(随机写性能差)。
2.唯一索引(unique index)
- 索引列的值必须唯一,但允许有
null(多个 null 不冲突)。 - 适用于:手机号、订单号、用户 id 等业务唯一字段。
- 创建方式:
create unique index idx_user_phone on users(phone);
3.普通索引(secondary index / normal index)
- 最基础的索引类型,允许重复值、允许 null。
- 用于加速
where、join、order by等查询。 - 示例:
create index idx_order_status on orders(status);
4.组合索引(composite index / 联合索引)
- 对多个列创建一个索引,如
(col1, col2, col3)。 - 遵循 最左前缀原则(leftmost prefix rule):
- 查询条件必须从最左列开始,才能命中索引。
- 例如:索引
(a, b, c)可用于where a=1、where a=1 and b=2,但不能用于where b=2。
- 建议:把区分度高(选择性好)的列放前面。
5.前缀索引(prefix index)
- 对长字符串字段(如
varchar(255))只索引前 n 个字符。 - 减少索引大小,提升性能。
- 示例:
create index idx_email_prefix on users(email(20)); -- 只索引前20字符
- ⚠️ 注意:前缀长度需通过
select count(distinct left(email, n)) / count(*)估算区分度。
二、按物理结构分类(innodb)
1.聚簇索引(clustered index)
- 数据即索引:叶子节点存储完整的数据行。
- innodb 自动使用主键作为聚簇索引;若无主键,则选择第一个唯一非空索引;否则用隐藏的
row_id。 - 优点:主键查询极快(一次 i/o)。
- 缺点:二级索引需“回表”(先查二级索引 → 再查聚簇索引)。
2.二级索引(secondary index)
- 叶子节点存储的是主键值,不是完整数据。
- 查询流程:二级索引 → 主键值 → 聚簇索引 → 获取数据(回表)。
- 优化回表:使用 覆盖索引(covering index),即查询字段全部包含在索引中,无需回表。
三、特殊索引类型(特定场景)
1.全文索引(full-text index)
- 用于
text或varchar字段的全文搜索(如文章内容搜索)。 - 支持
match() against语法。 - innodb 从 mysql 5.6 开始支持。
- 示例:
create fulltext index idx_content on articles(content); select * from articles where match(content) against('数据库'); - ⚠️ 不适用于电商商品名等短文本(用 es 更合适)。
2.空间索引(spatial index)
- 用于
geometry类型字段(如地图坐标、区域)。 - 仅 myisam 和 innodb(mysql 5.7+)支持。
- 使用
r-tree结构,支持st_contains()等空间函数。
四、不推荐或已废弃的索引
| 索引类型 | 说明 |
|---|---|
| hash 索引 | memory 引擎支持,innodb 不支持(但自适应哈希索引 ahi 是内部优化) |
| rtree 索引 | 旧版 myisam 用,现已被 spatial 取代 |
💡 innodb 的 自适应哈希索引(adaptive hash index, ahi) 是 innodb 自动为热点索引页构建的内存哈希结构,无需手动创建,可通过
show engine innodb status查看。
五、索引设计黄金法则(电商场景重点)
- 主键自增:避免 uuid 导致聚簇索引频繁页分裂。
- 组合索引合理排序:高频过滤字段放前,范围查询字段放后(如
(user_id, create_time))。 - 避免冗余索引:
(a,b)和(a)同时存在是冗余的。 - 大字段慎建索引:如
description字段,优先考虑前缀索引或异构存储(如 elasticsearch)。 - 监控慢查询:用
explain分析是否命中索引,关注type(最好ref/range,避免all)。
六、查看索引命令
-- 查看表索引 show index from table_name; -- 查看执行计划 explain select * from orders where user_id = 100; -- 查看索引使用统计(mysql 8.0+) select * from performance_schema.table_io_waits_summary_by_index_usage where object_schema = 'your_db' and object_name = 'your_table';
✅ 总结:
在电商开发中,主键索引 + 唯一索引 + 合理的组合索引 足以覆盖 95% 场景。
牢记:索引不是越多越好,而是越精准越好。
到此这篇关于mysql有5种索引类型及其特点的文章就介绍到这了,更多相关mysql索引类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论