1. 闲不住的人首页
  2. 技术笔记
  3. 数据库
  4. MySQL

MySQL 慢查询日志

MySQL 慢查询日志 的作用,在实际工作中,每个业务系统都离不开数据库,一个 简单的 SQL 语句却对性能有着极大的影响。SQL 优化也是作为一名运维工程师应该掌握的技能之一。通过慢查询日志,可以帮我们记录下那些执行时间大于我们所设定阈值的 SQL 语句。

要查看当前 MySQL 实例是否已经开启了慢查询日志使用 show global variables like ‘%slow%’;

查看mysql慢查询日志是否开启
查看mysql慢查询日志是否开启

默认情况下载安装完 MySQL 之后是没有启用慢查询日志的,要启用 MySQL 慢查询日志有两种方式,第一种是通过修改 my.cnf 配置文件,也是推荐的方式,不用担心重启实例后配置失效。第二种是在 MySQL 命令行通过 set global 方式设定,但是重启 MySQL 实例后会失效。

通过命令行开启

mysql> set global slow_query_log=ON; 

注意:使用 set global 设定启用慢查询日志,只在新的 MySQL 会话生效。

修改配置文件开启

在修改配置文件之前,先来了解几个参数的作用:

参数作用
slow_query_log是否开启慢查询日志
slow_query_log_file配置慢查询日志文件名
long_query_time设定慢查询阈值,运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
min_examined_row_limit扫描记录少于该值的 SQL 不记录到慢查询日志
log_queries_not_using_indexes将没有使用索引的 SQL 记录到慢查询日志
log_throttle_queries_not_using_indexes限制每分钟记录没有使用索引 SQL 语句的次数
log_slow_admin_statements记录管理操作,如 ALTER/ANALYZE TABLE
log_slow_slave_statements在从服务器上开启慢查询日志
log_timestamps写入时区信息
log_output={FILE|TABLE|NONE}慢查询日志格式
expire_logs_days=90

了解以上参数的作用之后我们就可以来修改 my.cnf 配置文件了,这些参数建议在 MySQL 安装之后就添加上。

[mysqld]
########log settings########
log_error = error.log
slow_query_log = 1
slow_query_log_file = slow.log
log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
long_query_time = 2
min_examined_row_limit = 100

修改一配置文件然后重启 mysql 服务就完成了。接下来执行一条 SQL 语句检查慢查询日志能否生效。

mysql> select sleep(4);
+----------+
| sleep(4) |
+----------+
|        0 |
+----------+
1 row in set (4.00 sec)

上面的 select sleep(4) 会睡眠 4 秒然后执行,接下查看 slow.log 日志中是否有记录存在。

查看mysql慢查询日志
查看mysql慢查询日志

mysqldumpslow 工具

mysqldumpslow 是 MySQL 自带的一个工具,专门用来查看慢查询日志。当你的 MySQL 慢查询过大时使用 vim 等编辑器打开非常的不便于查看,而且当同一条慢 SQL 反复被执行时会记录大量重复的记录,使用 mysqldumpslow 工具,可以帮我们将那些重复记录合并显示。

Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

-s sort_type

如何对输出进行排序。的值 sort_type应从以下列表中选择:

t,at:按查询时间或平均查询时间排序

l,al:按锁定时间或平均锁定时间排序

r,ar:按已发送的行或已发送的平均行进行排序

c:按计数排序

-r 颠倒排序顺序;
mysqldumpslow执行结果
mysqldumpslow执行结果

在上面执行结果中给出了如下信息:

  • 出现次数(Count)
  • 执行最长时间(Time)
  • 累计总耗费时间(Time)
  • 等待锁的时间(Lock)
  • 发送给客户端的行总数(Rows)
  • 扫描的行总数(Rows)
  • 用户以及 SQL 语句本身(抽象了一下格式,比如 sleep(4),用 sleep(N) 表示)

原创文章,作者:王恩志,如若转载,请注明出处:https://www.xbzdr.com/741.html

如果您喜欢本站,点击这儿 不花一分钱捐赠本站

发表评论

登录后才能评论

评论列表(1条)

  • martin
    martin 2020年3月6日 15:30

    写的好

联系我们

在线咨询:点击这里给我发消息

邮件:510749025@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code