MySQL索引全解析:四大核心维度掌握,查询性能提升立竿见影

10 阅读4分钟

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)

  • 支持类型POINTLINESTRINGPOLYGON 等地理数据。
  • 引擎支持: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 列)遵循最左前缀,合理排序字段顺序可大幅提升复用率

最佳实践:将区分度高查询频率高的字段放组合索引左侧。


总结:如何科学建索引?

  1. 主键必设:使用自增整数主键,避免随机 UUID 导致页分裂。
  2. 高频查询字段加普通索引:如状态、类型、时间等。
  3. 唯一性字段用唯一索引:如手机号、订单号。
  4. 多条件查询优先考虑组合索引:避免建多个单列索引。
  5. 警惕索引失效:函数操作、隐式类型转换、OR 条件不当等都会导致索引失效。
  6. 定期分析慢查询日志:用 EXPLAIN 查看执行计划,验证索引是否生效。