MYSQL--EXPLAIN 与慢 SQL 排查
本文介绍了MySQL性能优化的核心工具和方法。EXPLAIN命令用于分析SQL执行计划,重点关注type、rows、Extra等关键字段,判断查询是否使用了索引、是否存在全表扫描等问题。慢SQL排查思路包括开启慢查询日志、使用EXPLAIN和SHOW PROFILE等工具分析。常见优化场景涉及全表扫描、索引失效、排序分组等问题,解决方案包括添加合适索引、优化SQL写法(避免SELECT*/函数运算
一、
EXPLAIN的作用
EXPLAIN用于分析 SQL 执行计划,帮助我们了解 MySQL 在执行查询时的策略,从而判断性能瓶颈。explain 是查看 sql 的执行计划,主要用来分析 sql 语句的执行过程,比如有没有走索引,有没有外部排序,有没有索引覆盖等等。
使用方式:EXPLAIN SELECT * FROM user WHERE age > 18;
EXPLAIN输出的关键字段说明
id
查询中每个
SELECT的标识号,值越大优先级越高。复杂 SQL(子查询/联合查询)时用于区分执行顺序。
select_type
查询类型:
SIMPLE:简单查询(无子查询、UNION)。
PRIMARY:最外层查询。
SUBQUERY:子查询。
DERIVED:派生表(FROM 子句中的子查询)。
UNION:UNION 中第二个及以后的查询。table
当前行对应的表。
type(最重要,表示连接方式,性能从好到坏依次是):
system > const > eq_ref > ref > range > index > ALLALL 表示全表扫描,是最差的,需要重点优化。
possible_keys
可能用到的索引。
key
实际使用的索引。
key_len
索引使用的字节数,越小越精确。
ref
哪些列或常量与索引进行比较。
rows
预计扫描的行数(值越小越好)。
Extra
补充信息:
Using index:索引覆盖。
Using where:需要回表。
Using filesort:排序时没用索引,需要额外排序。
Using temporary:使用了临时表(常见于 GROUP BY)。补充:
二、慢 SQL 排查思路
1. 开启慢查询日志
(1)👉 我们可以通过设置 long_query_time 参数来定义 SQL 执行时间超过多少秒就被认为是“慢查询”。
# my.cnf 配置文件 slow_query_log = 1 slow_query_log_file = /var/lib/mysql/slow.log long_query_time = 1 # 超过1秒的SQL记录为慢查询这样配置后,MySQL 会把执行时间超过 1 秒 的 SQL 记录到
slow.log文件里。查看慢 SQL:
(2)👉 这个命令的作用是 查看当前 MySQL 慢查询日志功能是否开启。
SHOW VARIABLES LIKE 'slow_query_log';返回结果会是:
Variable_name Value slow_query_log ON
如果是 ON,说明已启用慢查询日志。
如果是 OFF,说明没启用。
2. 分析慢 SQL 的工具
EXPLAIN:查看执行计划。
SHOW PROFILE:分析 SQL 在各个阶段的耗时。
pt-query-digest:Percona 提供的日志分析工具。
三、常见慢 SQL 场景与优化方法
1. 全表扫描
SELECT * FROM user WHERE age = 20;
原因:没有索引,或索引失效。
解决:给
age加索引。
2. 索引未命中
SELECT * FROM user WHERE age = 20;
原因:对索引字段做了函数运算。
解决:不要对索引列做函数操作,可新增前缀索引
INDEX(name(3))。
3. 覆盖索引未使用
SELECT id, name FROM user WHERE age = 18;
优化:建联合索引
(age, id, name),避免回表,减少 IO。
4.
Using filesortSELECT * FROM user ORDER BY age;
原因:排序字段未使用索引。
解决:为
age建索引,或使用联合索引覆盖 ORDER BY。
5.
Using temporarySELECT age, COUNT(*) FROM user GROUP BY age;
原因:没有合适的索引。
解决:建立索引
(age)。
6.
IN过大SELECT * FROM user WHERE id IN (1,2,3,...,10000);
原因:IN 列表过大,效率低。
优化:
改用
JOIN。或用临时表存储 ID 再查询。
7. OR 查询
SELECT * FROM user WHERE age = 20 OR name = 'Tom';
原因:OR 会导致索引失效。
优化:使用
UNION ALL拆分。
UNION ALL是 SQL 中的集合操作符,它的作用是把两个或多个查询结果合并在一起,并且 不去重。SELECT * FROM user WHERE age = 20 UNION ALL SELECT * FROM user WHERE name = 'Tom';
四、慢 SQL 优化总结
索引优化
索引要覆盖常用查询条件、排序和分组字段。
联合索引遵循 最左前缀原则。
避免函数、隐式转换导致索引失效。
SQL 优化
少用
SELECT *,只查必要字段。拆分复杂 SQL,减少子查询,改用 JOIN。
大数据分页优化:
LIMIT offset, size→ 改成LIMIT size+ 记住上次 ID。架构优化
分库分表。
读写分离。
使用缓存(Redis)。
✅ 一句话总结:
EXPLAIN用来分析 SQL 执行计划,重点关注type、rows、Extra。慢 SQL 排查从 索引、SQL 写法、架构 三个层面优化。
更多推荐



所有评论(0)