Mysql慢日志、慢SQL

慢查询日志

查看执行慢的SQL语句,需要先开启慢查询日志。

MySQL 的慢查询日志,记录在 MySQL 中响应时间超过阀值的语句(具体指运行时间超过 long_query_time 值的SQL。long_query_time 的默认值为10,意思是运行10秒以上(不含10秒)的语句)。

目的:发现执行时间特别长的SQL查询,进行优化。

默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。

慢日志常用配置项

|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 | slow_query_log 是否启用慢查询日志,默认为0,可设置为0、1,1表示开启。 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 即不写入 |

一般情况下,我们只需开启慢日志记录,配置下阈值时间,其余参数可按默认配置。对于阈值时间,可灵活调整,比如说可以设置为 1s 或 3s 。

查看是否开启慢查询日志

|---|-------------------------------------------------|
| 1 | show variables ``like '%slow_query_log%'``; |

开启慢查询(临时,当前会话有效)

|---|-------------------------------------------|
| 1 | set global slow_query_log=``'ON'``; |

查看慢查询日志存放文件位置

|---|------------------------------------------------------|
| 1 | show variables ``like '%slow_query_log_file%'``; |

查看long_query_time阈值

|---|--------------------------------------------------|
| 1 | show variables ``like '%long_query_time%'``; |

设置long_query_time阈值(临时,当前会话有效)

|---|------------------------------------|
| 1 | set global long_query_time=3 |

直接修改配置文件(全局,需要重启服务,慎重)

|----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #编辑配置文件 vim /etc/my.cnf # 修改配置项(如果没有就加上) [mysqld] slow_query_log = ``ON slow_query_log_file = /var/lib/mysql/my-slow.log long_query_time = 1 log_timestamps = SYSTEM log_output = FILE # 重启mysqld服务 systemctl restart mysqld # 查看mysqld服务 systemctl status mysqld |

测试

|-----|-------------------------------------------------------|
| 1 2 | select sleep(5); ls /var/lib/mysql/xxx-slow.log |

慢查询日志文件分析

单条记录结构

单条记录结构:

|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 | # ``Time``: 2024-03-01T17:12:40.156488+08:00 # ``User``@Host: panda[panda] @ [192.168.72.1] Id: 8 # Query_time: 5.000688 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 SET timestamp``=1709284355; select sleep(5); |

字段说明:

慢查询日志以#作为起始符。

Time:查询的时间。

User@Host:表示用户 和 慢查询查询的ip地址。

如上所述,表示 root用户 localhost地址。

Query_time: 表示SQL查询持续时间, 单位 (秒)。

Lock_time: 表示获取锁的时间, 单位(秒)。

Rows_sent: 表示发送给客户端的行数。

Rows_examined: 表示:服务器层检查的行数。

set timestamp :表示 慢SQL 记录时的时间戳。

最后 select sleep(5) 则表示慢SQL语句。

慢查询日志分析-mysqldumpslow

MySQL自带了一个慢查询分析工具mysqldumpslow。

试了下不太好使。可以试试:

Navicat Monitor、signoz、hertzbeat 这些性能监测工具。

|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 | mysqldumpslow ­s c ­t 10 /var/run/mysqld/mysqld­slow.log # 取出使用最多的10条慢查询 mysqldumpslow ­s t ­t 3 /var/run/mysqld/mysqld­slow.log # 取出查询时间最慢的3条慢查询 mysqldumpslow ­s t ­t 10 ­g "left join" /database/mysql/slow­log #得到按照时间排序的前10条里面含有左连接的查询语句 mysqldumpslow ­s r ­t 10 ­g 'left join' /var/run/mysqld/mysqldslow.log # 按照扫描行数最多的 |

慢查询日志分析-Navicat Monitor

官网下载就行了。跟着指引配置即可。

很舒服,还可以自动提供一些运维建议。

查询分析

其他细节

记录管理语句

在 MySQL 中,慢查询日志中默认不记录管理语句,如:

|---|------------------------------------------------------|
| 1 | alter table``, analyze ``table``,``check table |

不过可通过以下属性进行设置:

|---|-----------------------------------------------------------------|
| 1 | mysql> ``set global log_slow_admin_statements = ``"ON"``; |

记录未走索引的SQL语句

在 MySQL 中,还可以设置将未走索引的SQL语句记录在慢日志查询文件中(默认为关闭状态)。通过下述属性即可进行设置:

|-----|----------------------------------------------------------------------------------------------------------------|
| 1 2 | mysql> ``set global log_queries_not_using_indexes = ``"ON"``; Query OK, 0 ``rows affected (0.00 sec) |

SQL 复制 全屏

慢查询日志输出位置

在MySQL中,日志输出格式有支持:FILE(默认),TABLE 两种,可进行组合使用。如下所示:

|---|-------------------------------------------------|
| 1 | set global log_output = ``"FILE,TABLE"``; |

这样设置会同时在 FILE, mysql库中的slow_log表中同时写入。

|---|---------------------------------------|
| 1 | select * ``from mysql.slow_log; |

相关推荐
Allen Bright24 分钟前
Redis主从架构
数据库·redis·架构
ZHOU西口28 分钟前
MySQL系列之远程管理(安全)
数据库·mysql·安全·tls·加密连接·require_secure
Karoku0661 小时前
【docker集群应用】Docker网络与资源控制
运维·数据库·docker·容器
扬子鳄0081 小时前
Spring Boot自动配置机制
java·数据库·spring boot
秋意钟1 小时前
sql漏洞
数据库·oracle
cdut_suye2 小时前
C++11新特性探索:Lambda表达式与函数包装器的实用指南
开发语言·数据库·c++·人工智能·python·机器学习·华为
Mr_Xuhhh2 小时前
程序地址空间
android·java·开发语言·数据库
大明湖的狗凯.2 小时前
MySQL 中的乐观锁与悲观锁
java·数据库·mysql
真上帝的左手2 小时前
数据库-MySQL-MybatisPlus整合多数据源
数据库·mysql·mybatis
奈斯ing2 小时前
【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)
数据库·mysql