TIPS
本文基于MySQL 8.0,理论支持MySQL 5.0及更高版本。
本文来自于课程:《Java架构师体系课:跟随千万级项目从0到100全过程高效成长》
本文探讨慢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]段落中加入如上参数即可
例如:
[mysqld]
# ...
log_output = 'FILE,TABLE';
slow_query_log = ON
long_query_time = 0.001
然后重启MySQL,例如:
service mysqld restart
方式二、通过全局变量设置
这种方式无需重启即可生效,但一旦重启,配置又会丢失。
例如:
set global log_output = 'FILE,TABLE';
set global slow_query_log = 'ON';
set global long_query_time =0.001;
这样设置之后,就会将慢查询日志同时记录到文件以及mysql.slow_log表中。
分析慢查询日志
分析慢查询日志表
当log_output = TABLE时,可直接用如下语句分析:
select * from `mysql`.slow_log
然后按照条件做各种查询、统计、分析。
分析慢查询日志文件
mysqldumpslow
当log_output = FILE时,可使用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条SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/8945073c23e0-slow.log
# 得到按照查询时间排序,并且带有left join的10条SQL
mysqldumpslow -s t -t 10 -g “left join” /var/lib/mysql/8945073c23e0-slow.log
pt-query-digest
出MySQL自带的mysqldumpslow外,也可以用pt_query_digest分析慢查询日志文件。pt-query-digest是Percona公司开发的工具,是Percona Toolkit工具套件中的工具之一。本文暂不展开,后面专门探讨Percona Tookit如何使用吧。
参考文档
学习更多:
慕课网为大家准备了一门按演进思路进行讲授的课程:《Java架构师体系课:跟随千万级项目从0到100全过程高效成长》 希望能够帮助大家在演进的过程跟随千万级项目从0到100全过程高效成长。