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; |

相关推荐
cyt涛40 分钟前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油1 小时前
01_SQLite
数据库·sqlite
liuxin334455661 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。2 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec2 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa2 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke2 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录3 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.3 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构