QF清风笔记 · 技术
技术避坑 · MySQL

MySQL 慢查询排查:索引不是加得越多越好

慢查询最容易被一句“加索引”带偏。真正的排查要从查询条件、数据分布、执行计划、排序分页和返回字段一起看。

MySQL索引慢查询
SQL

先看执行计划,不要凭感觉加索引

`EXPLAIN` 能告诉你表访问方式、可能使用的索引、实际选择的索引、扫描行数和额外操作。看到 `type=ALL`、`Using filesort`、`Using temporary` 不一定马上加索引,但一定要回到 SQL 本身看条件是否合理。

很多慢查询来自组合问题:条件字段顺序不匹配联合索引,like 前缀带通配符,函数包住索引列,排序字段和过滤字段分离,深分页扫描太多行,或者返回字段过大导致回表成本高。

联合索引要服务具体查询

高区分度

优先把能快速缩小范围的字段放到合适位置。

过滤加排序

常见列表页要同时考虑 `where` 和 `order by`。

覆盖索引

高频小字段查询可减少回表,但不要把大字段塞进索引。

索引也有维护成本

索引会占空间,并拖慢写入、更新和删除。一个表如果为了每个查询都加一条索引,后续写入压力和优化器选择都会变复杂。更稳妥的方式是结合慢查询日志、接口调用频率和业务重要性,优先优化高频且可复用的索引。

排查口诀:先确认慢在哪,再看执行计划;先改 SQL 和分页方式,再补索引;先服务真实高频查询,再考虑理论最优。