慢SQL查询日志

2020-10-17 15:46:08 蜻蜓队长

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全过程高效成长。

点击查看更多内容

以上内容来自于网络,如有侵权联系即删除
相关文章

上一篇: Java架构师面试网整理-JVM面试专题(共8题含答案)

下一篇: Spark 系列(二)—— Spark开发环境搭建

客服紫薇:15852074331
在线咨询
客户经理