mysql-slow-query

MySQL 慢查询的定位与优化

现象

接口变慢、数据库 CPU/IO 升高、连接堆积。慢查询日志或 performance_schema 里能看到执行时间长的 SQL。

快速定位

mysql -e 'SHOW VARIABLES LIKE "slow_query_log";'
mysql -e 'SHOW VARIABLES LIKE "long_query_time";'
mysql -e 'SHOW PROCESSLIST;'
mysql -e 'SHOW FULL PROCESSLIST;'
EXPLAIN SELECT ...;
EXPLAIN ANALYZE SELECT ...;
SHOW INDEX FROM app.orders;
SELECT * FROM sys.statement_analysis ORDER BY total_latency DESC LIMIT 10;

常见根因

  1. 缺索引或索引选择性差,导致全表/全索引扫描。
  2. 在索引列上使用函数、隐式类型转换或前导模糊匹配。
  3. 统计信息过期,优化器选错执行计划。
  4. 锁等待、长事务或大结果集排序。
  5. 连接数过多、缓存命中率低或磁盘 I/O 饱和。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. 如何确认慢查询日志已开启并找出主要慢 SQL?
  2. EXPLAIN 中应重点看哪些字段判断是否走索引?
  3. 哪些写法会让索引失效,如何优化?
答案
  1. 查 slow_query_log 和 long_query_time 变量,结合 SHOW FULL PROCESSLIST、慢日志和 sys.statement_analysis 按总耗时排序。
  2. 看 type、key、rows 和 Extra,确认是否使用索引、扫描行数是否过大。
  3. 索引列上使用函数、隐式类型转换或前导模糊匹配会导致失效;应改写 SQL,按最左前缀补联合/覆盖索引并更新统计信息。