3步抓出慢SQL,别等半夜被叫醒😴

0 阅读1分钟

我是小耶,干运营半路出家的野生DBA——写功课只是为了我踩过的坑,你们别再踩了!

你们遇到过这种情况吗?业务反馈页面转圈,登录数据库一看,CPU 100%。但不知道是哪个SQL干的。

这时候别慌,三条命令依次用。

1. 先看当前在跑的查询

sql

SHOW PROCESSLIST;

结果里找Command列为QueryTime列数值大的那些。Time表示执行了多少秒,越大越可疑。拿到Id,可以直接KILL <id>

2. 打开慢查询日志(提前做)

MySQL设置:

text

slow_query_log = ON
long_query_time = 2
slow_query_log_file = /var/log/mysql/slow.log

超过2秒的SQL会被记录。每天上班第一件事:看一眼昨天的慢查询日志,别等用户投诉。

bash

mysqldumpslow -s t /var/log/mysql/slow.log

-s t按时间排序,最慢的排前面。

3. 抓到慢SQL后,用EXPLAIN分析

sql

EXPLAIN SELECT ...;

重点看三列:

  • typeALL是全表扫描(危险),refrange是走索引(还行),const是最优
  • rows:预估扫描的行数,越大越慢
  • Extra:出现Using filesortUsing temporary,说明有排序或临时表,通常需要优化

顺手记一个组合拳

sql

EXPLAIN FORMAT=JSON SELECT ...;

输出JSON格式,能看到更详细的成本估算。适合出事故后写复盘报告用。

小耶在手,SQL不愁。

你今天慢查询日志里抓到最慢的SQL跑了多少秒?