MySql--慢查询

摘要

慢查询

  • 什么是慢查询
    慢查询日志,顾名思义,就是查询花费大量时间的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。

  • 开启慢查询

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mysql> show VARIABLES like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+

# 开启慢查询日志
mysql> set GLOBAL slow_query_log=1;

# 默认阈值是10秒,超过这个阈值就会记录慢查询日志,可以根据需要进行修改
mysql> show VARIABLES like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

# 如果运行的SQL语句没有使用索引,则MySQL数据库也可以将这条SQL语句记录到慢查询日志文件,默认关闭
mysql> show VARIABLES like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+

# 产生的慢查询日志,可以指定输出的位置,通过参数log_output来控制,可以输出到[TABLE][FILE][FILE,TABLE],默认FILE,如果指定TABLE,则会记录在mysql.slow_log表中
mysql> show VARIABLES like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+

# 生成的日志文件默认在datadir指定的目录下,也可以自己设置
mysql> show VARIABLES like 'slow_query_log_file';
+---------------------+-------------------------------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------------------------------+
| slow_query_log_file | /usr/local/soft/mysql8/datas/mysql/ip-10-250-0-214-slow.log |
+---------------------+-------------------------------------------------------------+
  • 慢查询日志格式

1
2
3
4
5
6
7
8
“Time: 2021-04-05T07:50:53.243703Z”:查询执行时间
“User@Host: root[root] @ localhost [] Id: 3”:用户名 、用户的IP信息、线程ID号
“Query_time: 0.000495”:执行花费的时长【单位:秒】
“Lock_time: 0.000170”:执行获得锁的时长
“Rows_sent”:获得的结果行数
“Rows_examined”:扫描的数据行数
“SET timestamp”:这SQL执行的具体时间
最后一行:执行的SQL语句
  • 慢查询分析mysqldumpslow

1
2
3
4
5
6
7
8
mysqldumpslow -s r -t 10 /usr/local/soft/mysql8/datas/mysql/ip-10-250-0-214-slow.log

# 参数说明:
-s 对结果进行排序,怎么排,根据后面所带的 (c,t,l,r,at,al,ar),缺省为at
c:总次数 t:总时间 l:锁的时间 r:获得的结果行数
at,al,ar :指t,l,r平均数 【例如:at = 总时间/总次数】
-t NUM just show the top n queries:仅显示前n条查询
-g PATTERN grep: only consider stmts that include this string:通过grep来筛选语句。