慢查询日志是MySql内置的一项功能,可以记录超过指定时间的SQL语句
相关参数配置
参数 | 作用 | 默认值 |
---|---|---|
log_output | 日志输出到哪儿,默认FILE,表示文件;设置成TABLE,则将日志记录到mysql.slow_log中。也可设置多种格式,比如 FILE 、TABLE | FILE |
long_query_time | 执行时间超过这么久才记录到慢查询日志,单位秒,可使用小数表示小于秒的时间 | 10 |
log_queries_not_using_indexes | 是否要将未使用索引的SQL记录到慢查询日志中,此配置会无视long_query_time的的配置。生产环境建议关闭;开发环境建议开启。 | OFF |
log_throttle_queries_not_using_indexes | 和log_queries_not_using_indexes配合使用,如果log_queries_not_using_indexes打开,则该参数将限制每分钟写入的、未使用索引的SQL数量。 | 0 |
min_examined_row_limit | 扫描行数至少达到这么多才记录到慢查询日志 | 0 |
log_slow_admin_statements | 是否要记录管理语句,默认关闭。管理语句包括ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE。 | OFF |
slow_query_log_file | 指定慢查询日志文件路径 | /var路径 |
log_slow_slave_statements | 该参数在从库上设置,决定是否记录在复制过程中超过long_query_time的SQL。如果binlog格式是row,则该参数无效 | OFF |
log_slow_extra | 当log_output=FILE时,是否要记录额外信息(MySQL 8.0.14开始提供),对log_output=TABLE的结果无影响。 | OFF |
使用方式
方式一
修改配置文件my.cnf 在[mysqld]段落加上参数即可,然后重启MySQL
[mysqld]
# ...
log_output = 'FILE,TABLE';
slow_query_log = ON
long_query_time = 0.001
SET GLOBAL log_queries_not_using_indexes = 'ON';
关于long_query_time 设置后有一个问题
设置完成后,没有生效,需要断开连接后重新连接才能生效
方式二
通过全局变量设置,这种方式无需重启即可生效,但是重启后需要重新配置
set global log_output = 'FILE,TABLE';
set global slow_query_log = 'ON';
set global long_query_time =0.001;
分析慢查询日志
运行一条查询语句,因为设置的慢sql查询时间是0.001秒,所以执行的语句都会被触发
SELECT * FROM employees;
慢查询日志表
当log_output = TABLE时,可直接用如下语句分析:
select * from mysql
.slow_log
start_time: 执行sql语句的时间
user_host: 执行sql的主机
query_time: 执行用时
lock_time: sql占有锁的时间
rows_sent:这条sql返回了多少条数据到客户端
rows_examined:这条sql语句扫描了多少行
db: 执行sql的目标数据库
last_insert_id: 最后一条自增的ID
insert_id: 插入的id
server_id: 服务器id ,配置主从数据库时的设置
sql_text: 当前执行的sql
thread_id:执行sql的线程id
慢查询日志文件
当log_output = FILE时,首先查看日志文件存放的地址
show VARIABLES LIKE "%slow_query_log_file%";
然后打开存放的文件,可以看到文件类型的日志,是每5行表示一个sql,周而复始
人工分析比较麻烦。所以mysql提供了工具mysqldumpslow
➜ mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
Parse and summarize the MySQL slow query log. Options are
--verbose verbose
--debug debug
--help write this text to standard output
-v 展示更详细的信息
-d debug
-s ORDER 以哪种方式排序,默认at
al: 平均锁定时间
ar: 平均返回记录数
at: 平均查询时间
c: 访问计数
l: 锁定时间
r: 返回记录
t: 查询时间
-r 将-s的排序倒序
-t NUM top n的意思,展示最前面的几条
-a 不去将数字展示成N,将字符串展示成'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN 后边可以写一个正则,只有符合正则的行会展示
-h HOSTNAME 慢查询日志以 主机名-slow.log的格式命名,-h可指定读取指定主机名的慢查询日志,默认情况下是*,读取所有的慢查询日志
-i NAME MySQL Server的实例名称(如果使用了mysql.server startup脚本的话)
-l 不将锁定时间从总时间中减去
如果要返回10条执行最慢的语句,需要执行的操作是
mysqldumpslow -s t -t 10 VM-0-4-centos-slow.log
# 得到按照查询时间排序,并且带有left join的10条SQL
mysqldumpslow -s t -t 10 -g 'left join' /var/lib/mysql/ VM-0-4-centos-slow.log