如何配置与查看慢查询
mysql 慢查询相关命令:
# 查看慢查询是否开启
SHOW VARIABLES LIKE '%slow_query_log%'
# 开启慢查询
SET GLOBAL slow_query_log='ON'
# 查看慢查询日志位置
SHOW VARIABLES LIKE '%slow_query_log_file%'
# 查看慢查询阈值,单位:秒
SHOW GLOBAL VARIABLES LIKE '%long_query_time%'
# 修改慢查询阈值,单位:秒
SET long_query_time=1
# 查看慢查询语句的数量
SHOW GLOBAL STATUS LIKE '%Slow_queries'
# 测试执行一个慢查询语句
SELECT SLEEP(3);
前面是通过命令行的方式设置,如果MySQL重启,那么配置就会重置。我们可以通过修改MySQL的配置my.cfg或者my.ini永久生效。
[mysqld]
slow_query_log=ON # 开启慢查询日志开关
slow_query_log_file=/var/lib/mysql/alvin-slow.log # 慢查询日志的目录和文件名信息
long_query_time=3 # 设置慢查询的阈值为3秒,超出此设定值的SQL即被记录到慢查询日志
log_output=FILE
可以配置的参数有:
- slow_query_log:是否启用慢查询日志。
- slow_query_log_file:指定慢查询日志位置及名称,默认值为host_name-slow.log,可指定绝对路径。
- long_query_time:慢查询执行时间阈值,超过此时间会记录,默认为10,单位为s。
- log_output:慢查询日志输出目标,默认为file,即输出到文件。
- log_timestamps:主要是控制 error log、slow log、genera log 日志文件中的显示时区,默认使用UTC时区,建议改为 SYSTEM 系统时区。
- log_queries_not_using_indexes:是否记录所有未使用索引的查询语句,默认为off。
- min_examined_row_limit:对于查询扫描行数小于此参数的SQL,将不会记录到慢查询日志中,默认为0。
- log_slow_admin_statements:慢速管理语句是否写入慢日志中,管理语句包含 alter table、create index 等,默认为 off 即不写入。
分析慢查询日志
通过前面命令行的操作,我们可以在慢查询日志文件中看到以下内容:
MySQL, Version: 5.7.28 (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: MySQL
Time Id Command Argument
# Time: 2023-06-07T08:01:23.502495Z
# User@Host: root[root] @ localhost [127.0.0.1] Id: 2
# Query_time: 2.999793 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1686124883;
select sleep(3);
写入日志的每个语句都以 # 字符开头。对于每一组慢SQL,第一行记录的是该条 SQL 执行的时刻,第二行记录的是执行该语句的用户和 IP 以及链接 id ,第三行的几个字段解释如下:
- Query_time: duration 语句执行时间,以秒为单位。
- Lock_time: duration 获取锁的时间(以秒为单位)。
- Rows_sent: N 发送给 Client 端的行数。
- Rows_examined: N 服务器层检查的行数(不计算存储引擎内部的任何处理)。
最下面的两行分别是此语句执行时候的时间戳和具体的慢 SQL 。