当前位置: 代码网 > it编程>数据库>Mysql > MySQL有5种索引类型及其特点详解

MySQL有5种索引类型及其特点详解

2026年01月15日 Mysql 我要评论
前言mysql(尤其是 innodb 引擎)支持多种索引类型,不同索引适用于不同场景。以下是 mysql 中常见的索引类型及其特点,按逻辑分类和物理结构两个维度说明:一、按逻辑用途分类(常用)1.主键

前言

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
  • 用于加速 wherejoinorder by 等查询。
  • 示例:
    create index idx_order_status on orders(status);
    

4.组合索引(composite index / 联合索引)

  • 多个列创建一个索引,如 (col1, col2, col3)
  • 遵循 最左前缀原则(leftmost prefix rule)
    • 查询条件必须从最左列开始,才能命中索引。
    • 例如:索引 (a, b, c) 可用于 where a=1where 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)

  • 用于 textvarchar 字段的全文搜索(如文章内容搜索)。
  • 支持 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 查看。

五、索引设计黄金法则(电商场景重点)

  1. 主键自增:避免 uuid 导致聚簇索引频繁页分裂。
  2. 组合索引合理排序:高频过滤字段放前,范围查询字段放后(如 (user_id, create_time))。
  3. 避免冗余索引(a,b)(a) 同时存在是冗余的。
  4. 大字段慎建索引:如 description 字段,优先考虑前缀索引或异构存储(如 elasticsearch)。
  5. 监控慢查询:用 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索引类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com