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

 更新时间:2026年01月15日 09:46:50   作者:旷野说  
MySQL中的索引类型多种多样,每种索引类型都有其特定的使用场景和优势,这篇文章主要介绍了MySQL有5种索引类型及其特点的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

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索引类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql查询表是否被锁的方法

    mysql查询表是否被锁的方法

    在本篇文章里小编给大家分享的是关于mysql查询表是否被锁的方法,有需要的朋友们可以参考下。
    2020-10-10
  • 详解如何修改MySQL最大连接数

    详解如何修改MySQL最大连接数

    本文主要介绍了详解如何修改MySQL最大连接数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • mysql中between的用法及说明

    mysql中between的用法及说明

    这篇文章主要介绍了mysql中between的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • MySQL关闭SSL的简单方法

    MySQL关闭SSL的简单方法

    这篇文章主要介绍了MySQL关闭SSL的简单方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • mysql优化之路----hash索引优化

    mysql优化之路----hash索引优化

    本文是笔者自己做的关于mysql的优化方面的小测试,暂时仅仅做了hash索引优化的测试,以后会做更多方面,希望能够给您带来收获,祝您工作愉快。
    2014-08-08
  • 关于mysql数据库误删除后的数据恢复操作说明

    关于mysql数据库误删除后的数据恢复操作说明

    下面小编就为大家带来一篇关于mysql数据库误删除后的数据恢复操作说明。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Mysql之EXPLAIN显示using filesort介绍

    Mysql之EXPLAIN显示using filesort介绍

    EXPLAIN 是mysql解释select查询的一个关键字,可以很方便的用于调试
    2012-02-02
  • MySQL中IF语句的基础及进阶用法

    MySQL中IF语句的基础及进阶用法

    在Mysql数据库中实现判断功能有很多方式,具体又分为函数和if语句形式,下面这篇文章主要给大家介绍了关于MySQL中IF语句的基础及进阶用法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • MySQL8.0+版本1045错误的问题及解决办法

    MySQL8.0+版本1045错误的问题及解决办法

    这篇文章主要介绍了MySQL8.0+版本1045错误解决办法,使用命令行登录MySQL报错1045 Access denied for user ‘root’@‘localhost’ (using password:YES),折腾半天才解决问题,需要的朋友可以参考下
    2022-08-08
  • MySQL 聚合函数排序

    MySQL 聚合函数排序

    这篇文章主要介绍了MySQL查询排序与查询聚合函数用法,结合实例形式分析了MySQL查询结果排序以及查询聚合函数相关使用技巧,需要的朋友可以参考下
    2021-07-07

最新评论