作者:闲不住的人
MySQL 慢查询日志的作用
在实际工作中,每个业务系统都离不开数据库,一个 简单的 SQL 语句却对性能有着极大的影响。SQL 优化也是作为一名运维工程师应该掌握的技能之一。通过慢查询日志,可以帮我们记录下那些执行时间大于我们所设定阈值的 SQL 语句。
配置 MySQL 慢查询日志
要查看当前 MySQL 实例是否已经开启了慢查询日志使用 show global variables like '%slow%';

默认情况下载安装完 MySQL 之后是没有启用慢查询日志的,要启用 MySQL 慢查询日志有两种方式,第一种是通过修改 my.cnf 配置文件,也是推荐的方式,不用担心重启实例后配置失效。第二种是在 MySQL 命令行通过 set global 方式设定,但是重启 MySQL 实例后会失效。
通过命令行开启 MySQL 慢查询日志
mysql> set global slow_query_log=ON;
注意:使用 set global 设定启用慢查询日志,只在新的 MySQL 会话生效。
修改配置文件开启 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 日志中是否有记录存在。

mysqldumpslow 工具
mysqldumpslow 是 MySQL 自带的一个工具,专门用来查看慢查询日志。当你的 MySQL 慢查询过大时使用 vim 等编辑器打开非常的不便于查看,而且当同一条慢 SQL 反复被执行时会记录大量重复的记录,使用 mysqldumpslow 工具,可以帮我们将那些重复记录合并显示。
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
-s sort_type
如何对输出进行排序。的值 sort_type应从以下列表中选择:
t,at:按查询时间或平均查询时间排序
l,al:按锁定时间或平均锁定时间排序
r,ar:按已发送的行或已发送的平均行进行排序
c:按计数排序
-r 颠倒排序顺序;

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

网友评论