慢日志查询时mysql内置的一项功能,可以记录执行超过指定时间的sql语句
发现慢sql的工具
- Skywalking
- VisualVM
- JavaMelody
1、相关参数及其默认值
| 参数 | 作用 | 默认值 |
|---|---|---|
| slow_query_log | 是否开启慢查询日志 | OFF |
| log_output | 日志存储方式。FILE表示将日志存入文件,TABLE表示将日志存入数据库mysql.slow_log表中,log_output=’FILE,TABLE’表示同时配置两种 | FILE |
| long_query_time | 慢查询阈值,当查询时间多于设定的阈值时,记录日志,单位秒。开发环境建议开启,开发环境建议关闭 | 10 |
| log_queries_not_using_indexes | 是否将未使用索引的查询也被记录到慢查询日志中,此配置会无视long_query_time,开发环境建议开启,开发环境建议关闭 | OFF |
| log_throttle_queries_not_usig_indexes | 和log_queries_not_using_indexes配合使用,如果log_queries_not_using_indexes打开则该参数会限制每分钟写入的,未使用索引的sql数量 | 0 |
| min_examined_row_limit | 扫描行数达到这么多才记到慢查询日志 | 0 |
| log_slow_admin_statement | 是否要记录管理语句,管理语句包括ALTER TABLE,ANALYZE TABLE,CHECK TABLE,CREATE TABLE,CREATE INDEX,DROP INDEX,OPTIMIZE TABLE, REPAIR TABLE | OFF |
| slow_query_log_file | MySQL数据库慢查询日志存储路径 | |
| log_slow_slave_statements | 该参数在从库上设置,决定是否记录在复制过程中超过long_query_time的sql。如果binlog的格式是row,则该参数无效 | OFF |
| log_slow_rxtra | 当log_output为file时,是否要记录额外信息(mysql 8.0.14开始提供),对log_output=TABLE的结果无影响 | OFF |
2、参数使用方式
show global variables like '%log%'
(1)方式1:修改配置文件my.cnf
在mysqlId段落中加上如上参数,然后重启mysql
[mysqld]# ...log_output = 'FILE,TABLE'
(2)方式2:设置全局变量
无需重启即可生效,但是重启后就会失效
set global slow_query_log= 'ON'
set global log_output = 'FILE,TABLE'
set global long_query_time = 0.001
set global log_queries_not_using_indexes = 'ON'
3、分析慢查询日志
当log_output = ‘TABLE’时可以通过select * frommysql.slow_log 按条件进行各种查询统计分析。
当log_output = ‘FILE’时,通过show global variables like '%slow_query_log_file%',查询慢日志文件路径
use employees;
SET timestamp=1613223390;
select * from employees;
# Time: 2021-02-13T13:36:30.436841Z
# User@Host: root[root] @ localhost [::1] Id: 13
# Query_time: 0.000331 Lock_time: 0.000104 Rows_sent: 4 Rows_examined: 79
SET timestamp=1613223390;
在实际生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow,mysqldumpslow —help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] -- 后跟参数以及log文件的绝对地址;
-s what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r reverse the sort order (largest last instead of first)
-t NUM just show the top n queries
-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 grep: only consider stmts that include this string
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l don't subtract lock time from total time
常见用法:
mysqldumpslow -s c -t 10 /var/run/mysqld/mysqld-slow.log # 取出使用最多的10条慢查询
mysqldumpslow -s t -t 3 /var/run/mysqld/mysqld-slow.log # 取出查询时间最慢的3条慢查询
mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log # 得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s r -t 10 -g 'left join' /var/run/mysqld/mysqld-slow.log # 按照扫描行数最多的
