在数据库开发和性能优化领域,MySQL 索引几乎是所有“慢查询”问题的核心——很多时候,你反复调整 SQL 语句,最终才发现根源不过是索引没建对、没用好。本文不堆砌概念,而是从四个实操维度将索引的分类逻辑彻底讲透,帮你建立一套清晰的知识框架。理解了这些,查询优化这件事至少能少走 90% 的弯路。 一
在数据库开发和性能优化领域,MySQL 索引几乎是所有“慢查询”问题的核心——很多时候,你反复调整 SQL 语句,最终才发现根源不过是索引没建对、没用好。本文不堆砌概念,而是从四个实操维度将索引的分类逻辑彻底讲透,帮你建立一套清晰的知识框架。理解了这些,查询优化这件事至少能少走 90% 的弯路。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
这是开发者在日常工作中接触最多的一种分类方式,直接决定了该为哪些字段建哪种索引。
特点:唯一、非空、每表只有一个;InnoDB 引擎会自动将其建为聚簇索引。
作用:唯一标识每一行记录,缺少它表结构就不完整。
示例:
CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id));
特点:值必须唯一(但允许多个 NULL),一张表可以有多个;主要用于业务层面的唯一性约束。
适用场景:手机号、邮箱等需要去重但又不是主键的字段。
示例:
CREATE UNIQUE INDEX idx_user_phone ON user(phone);
特点:没有任何约束,单纯为了加速查询;这也是最常用的一种。
适用场景:经常出现在 WHERE、JOIN、ORDER BY 中的字段,添加普通索引往往立竿见影。
示例:
CREATE INDEX idx_user_name ON user(name);
特点:专门配合 MATCH ... AGAINST 语法进行全文检索;仅适用于 CHAR、VARCHAR、TEXT 类型。
注意:很多人习惯用 LIKE '%关键词%' 做模糊匹配,但这种写法 B+Tree 索引根本用不上——此时全文索引才是唯一解。
示例:
CREATE FULLTEXT INDEX idx_article_content ON article(content);
特点:多个字段组合成一个索引,但必须遵守最左前缀原则。
优势:一个组合索引就能覆盖多个查询条件,减少索引数量,同时提升多条件过滤的效率。
示例:
CREATE INDEX idx_user_age_name ON user(age, name);-- 可以加速 WHERE age=25 AND name='张三'-- 也可以加速 WHERE age=25(但不能加速仅 WHERE name='张三')
索引说到底就是数据结构,不同的结构适合不同的查询模式,理解这一点才能真正明白为什么有些查询快、有些慢。
引擎支持:InnoDB、MyISAM 默认均使用它。
优势:
>、<、BETWEEN)毫无压力ORDER BY)也能直接利用适用场景:90% 以上的业务查询都能搞定的通用型选手。
引擎限制:Memory 引擎原生支持;InnoDB 内部有自适应 Hash 索引,但不可手动创建。
优势:等值查询(=、IN)速度快,时间复杂度 O(1)。
劣势:
适用场景:内存表中高频的精确匹配查询。
POINT、LINESTRING、POLYGON 等地理空间数据。MATCH ... AGAINST 语法才能生效。| 类型 | 说明 | 注意事项 |
|---|---|---|
| 单列索引 | 仅包含一个字段 | 简单直接,但容易建多了变成冗余 |
| 组合索引 | 包含 2~16 个字段(InnoDB 上限是 16 列) | 必须遵循最左前缀原则;字段顺序排得好,一个索引可当多个使用 |
最佳实践:将区分度高、查询频率高的字段放在组合索引的左侧,这样索引的复用率最高。
OR 条件等都会让索引变成摆设。EXPLAIN 查看执行计划,验证索引是否被实际使用。侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述