0%

MySQL调优-3-慢SQL

查询慢SQL是否开启

1
show variables like '%slow_query_log%';

开启慢SQL

1
2
3
4
5
6
7
[mysqld]
## 开启慢查询日志,开启后将会记录执行时间超过 long_query_time 参数值的 SQL 语句( 一般临时开启即可 )
slow_query_log = ON
## 定义执行时间超过多少秒为慢查询,默认 10s
long_query_time = 5
## 定义慢查询日志存放位置
slow_query_log_file = /data/mysql/logs/slow.log

分析工具mysqldumpslow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@crc-uat-oa-mysql bin]# ./mysqldumpslow  --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

--verbose verbose
--debug 调试
--help 帮助文档
-v verbose
-d 调试
# 表示按何种方式排序
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: 平均 锁定时间
ar: 平均 返回记录
at: 平均 查询时间
c: 访问次数
l: 锁定时间
r: 返回记录
t: 查询时间
-r 颠倒排序顺序(最大的最后一个而不是第一个)
-t NUM 返回前面多少条数据
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN 后面搭配一个正则匹配模式,大小写不敏感。
-h HOSTNAME 数据库服务器的主机名 for *-slow.log 文件,默认是 '*', 表示匹配所有
-i NAME 服务器实例的名称(如果使用mysql.server启动脚本
-l 不要从总时间中减去锁定时间

测试

1
2
3
4
5
6
7
8
9
10
11
# 得到返回记录集最多的10 个SQL
./mysqldumpslow -s r -t 10 /data/mysql/logs/slow.log

# 得到访问次数最多的10 个SQL
./mysqldumpslow -s c -t 10 /data/mysql/logs/slow.log

# 得到按照时间排序的前10 条里面含有左连接的查询语句
./mysqldumpslow -s t -t 10 -g "left join" /data/mysql/logs/slow.log

# 另外建议在使用这些命令时结合| 和more 使用,否则有可能出现爆屏情况
./mysqldumpslow -s r -t 10 /data/mysql/logs/slow.log | more