首页 > 数据库 >MySQL查看执行慢的SQL语句(慢查询)

MySQL查看执行慢的SQL语句(慢查询)

时间:2024-03-04 09:02:18浏览次数:34  
标签:语句 slow log MySQL 查询 SQL query 日志

更新日志

点击查看
2024年3月4日 发布。

慢查询日志

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

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

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

慢日志常用配置项

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 。

查看是否开启慢查询日志

show variables like '%slow_query_log%';

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

set global slow_query_log='ON';

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

show variables like '%slow_query_log_file%';

查看long_query_time阈值

show variables like '%long_query_time%';

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

set global long_query_time=3

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

#编辑配置文件
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

测试

select sleep(5);

ls /var/lib/mysql/xxx-slow.log

慢查询日志文件分析

单条记录结构

单条记录结构:

# 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 这些性能监测工具。

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

官网下载就行了。跟着指引配置即可。
很舒服,还可以自动提供一些运维建议。
image

查询分析
image

其他细节

记录管理语句

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

alter table, analyze table,check table

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

mysql> set global log_slow_admin_statements = "ON";

记录未走索引的SQL语句

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

mysql> set global log_queries_not_using_indexes = "ON";
Query OK, 0 rows affected (0.00 sec)

慢查询日志输出位置

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

set global log_output = "FILE,TABLE";

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

select * from mysql.slow_log;

参考资料

https://www.navicat.com.cn/company/aboutus/blog/456-使用-mysql-慢速查询日志.html

标签:语句,slow,log,MySQL,查询,SQL,query,日志
From: https://www.cnblogs.com/cqpanda/p/18045399

相关文章

  • sql常见四种连接查询
    原文链接:https://learn.microsoft.com/zh-CN/sql/relational-databases/performance/joins?view=aps-pdw-2016-au7         https://www.cnblogs.com/alone-striver/p/9055078.html1、内部联接  INNERJOIN2、左外部联接  LEFT[OUTER]JOIN3、右......
  • python接口自动化系列(06):解析初始化sql
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/18033074实现目标将initSql中常用变量占位符(下图划线的)替换为实际值。 添加替换变量工具模块substitution_tool.py#!/usr/bin/envpython#-*-coding:utf-8-*-#@Author:韧#@wx:ren168632201#@Bl......
  • sql语句in的用法(使用多个列进行匹配)
    原文链接:https://www.cnblogs.com/hellohui/p/17670858.html今天遇到了in的新用法,即文中的第四条,使用多个列进行匹配,在此记录下。使用列值列表进行匹配:SELECT*FROM表名WHERE列名IN(值1,值2,值3,...)使用子查询返回多个结果进行匹配:SELECT*FROM表名WHERE......
  • [极客大挑战 2019]BabySQL 1
    [极客大挑战2019]BabySQL1审题还是SQL注入和之前的是一个系列的。知识点联合注入,双写绕过解题输入万能密码发现回显中没有or,猜测是使用正则过滤了or。尝试双写绕过登录成功使用联合查询,本题中过滤了from,where,or,by,union,select。看到4没有注入点,2和3都......
  • SQL注入注入方式(大纲)
    SQL注入注入方式(大纲)常规注入通常没有任何过滤,直接把参数存放到SQL语句中。宽字节注入GBK编码两个字节表示一个字符ASCII编码一个字节表示一个字符MYSQL默认字节集是GBK等宽字节字符集原理:设置MySQL时错误配置为setcharacter_set_client=gbk(它将客户端字符集设置......
  • SQL intern 29题记录及心得
    表结构21、豹子手机号用户(4个连续数字,如6666)和非豹子号用户的笔均消费金额分别是多少?withbas(selectusr_id,casewhenphone_numREGEXP'[0-9](?=\\1{3})'THEN'Leopard'`else'no-Leopard'`endasis_豹子fromid_inf)selectavg(a.trx_amt),is_豹......
  • 分支语句
    if语句  switch语句    ......
  • MySQL之pymysql模块
    Navicat软件我们在终端操作MySQL,既没有自动操作也无法保存,不方便开发,所以我们使用Navicat,Navicat内部封装了所有的操作数据库的命令。我们在使用它的时候只需要鼠标点击即可完成操作,无需书写SQL语句。详细参考:Day48-04navicat基本使用_哔哩哔哩_bilibili注释语法在navicat......
  • MySQL之多表操作
    第一步:创表#建表createtabledep( idintprimarykeyauto_increment,namevarchar(20));createtableemp( idintprimarykeyauto_increment,namevarchar(20),sexenum('male','female')notnulldefault'male',......
  • MySQL之视图、触发器、存储过程、函数和流程控制
    视图什么是视图视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用其实视图也是表为什么要用视图如果要频繁的操作一张虚拟表(拼表组成的),你就可以制作成视图,后续直接操作如何操作#固定语法createview表名as虚拟表的查询SQL语句#具体操作create......