当前位置: 首页 > 编程日记 > 正文

MySQL慢查询日志slowlog

0 慢查询日志定义

慢速查询日志记录的是执行时间超过long_query_time秒和检查的行数超过min_examined_row_limit的SQL语句,这些语句通常是需要进行优化的。

官方参考文档:https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html

1 慢查询日志的配置参数

服务器使用以下顺序的控制参数来决定是否将查询语句写入慢查询日志:

  1. 查询必须不是管理语句(如alter、optimize table等),或者必须启用log_slow_admin_statements参数记录管理类语句;
  2. 查询必须至少花费了long_query_time秒,或者必须启用log_queries_not_using_indexes,并且查询的索引没有行限制(如全表扫描、索引全扫描等);
  3. 查询必须至少检索了min_examined_row_limit行;
  4. 不被参数log_throttle_queries_not_using_indexes设置阈值限制写入慢sql日志。

下面介绍这些参数:

一、long_query_time

规定了查询时间超过此参数值被定义为慢SQL,状态变量Slow_queries记录了慢查询SQL的数量。long_query_time的单位为秒,可以设置成小数,精确到微妙。最小值为0,最大值为31536000,即365天,默认值为10。

查看当前设置:

mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.01 sec)

查看慢sql数量:

mysql> show status like 'slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 5     |
+---------------+-------+
1 row in set (0.01 sec)

将此参数设置为5:

mysql> set global long_query_time=5;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

二、slow_query_log

此参数决定是否激活慢sql日志,默认值是off,即关闭。

启用慢查询日志:

mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)

三、slow_query_log_file

此参数指定慢sql日志的文件路径和文件名,默认位置在数据目录datadir中,默认文件名是hostname-slow.log。

mysql> show variables like 'slow_query_log_file';
+---------------------+-------------------------------+
| Variable_name       | Value                         |
+---------------------+-------------------------------+
| slow_query_log_file | /disk1/data/mysql001-slow.log |
+---------------------+-------------------------------+
1 row in set (0.00 sec)

查看慢sql日志文件:

[mysql@mysql001 log]$ tailf /disk1/data/mysql001-slow.log
/usr/sbin/mysqld, Version: 8.0.34 (MySQL Community Server - GPL). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2023-12-20T22:44:21.890879+08:00
# User@Host: root[root] @ localhost []  Id:     9
# Query_time: 0.009038  Lock_time: 0.000008 Rows_sent: 0  Rows_examined: 0 Thread_id: 9 Errno: 0 Killed: 0 Bytes_received: 286 Bytes_sent: 92 Read_first: 0 Read_last: 0 Read_key: 12 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 1 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 1 Created_tmp_disk_tables: 0 Created_tmp_tables: 1 Start: 2023-12-20T22:44:21.881841+08:00 End: 2023-12-20T22:44:21.890879+08:00
SET timestamp=1703083461;
select f.title, count(*) as cnt
  from sakila.rental r
  join sakila.inventory i
    on r.inventory_id = i.inventory_id
  join sakila.film f
    on i.film_id = f.film_id
 where r.rental_date between '2005-03-01' and '2005-03-31'
 group by f.film_id
 order by cnt desc
 limit 10;

四、log_queries_not_using_indexes

启用该变量,会记录期望检索所有行的查询语句,也就是说做表全扫描。使用索引的查询也会被记录。例如,使用完整索引扫描的查询使用索引,但会记录日志,因为索引不会限制行数。默认值是false。

五、min_examined_row_limit

参数规定了只有当检索的行数超过了参数值的sql语句才会被记录到慢sql日志文件中,默认值是0,没有限制。可以和上一个参数log_queries_not_using_indexes搭配使用,可以避免记录一些访问小表的查询。

六、log_throttle_queries_not_using_indexes

该参数限制每分钟记录到慢查询日志中的查询语句数量,默认值是0,不限制。

七、log_slow_extra

参数log_slow_extra从MySQL 8.0.14开始可用,当启用时,将记录与慢sql相关的额外信息,如状态参数Handler_%。参数默认值为off,建议打开,将参数设置为on。

mysql> set global log_slow_extra=on;
Query OK, 0 rows affected (0.00 sec)

2 使用mysqldumpslow解释慢查询日志

MySQL慢速查询日志包含执行时间较长的查询信息,且包含的记录较多时,看起来比较困难。可以使用mysqldumpslow解析MySQL慢速查询日志文件,并总结日志内容。

一、摘要分析

mysqldumpslow会对查询进行摘要分析,8.0版本新添的两个分析摘要函数如下:

  1. statement_digest_text():返回摘要文本;
  2. statement_digest():返回摘要hashvalue。

用法如下:

mysql> select statement_digest_text("select user(),host from mysql.user where user = 'lu9up'");
+----------------------------------------------------------------------------------+
| statement_digest_text("select user(),host from mysql.user where user = 'lu9up'") |
+----------------------------------------------------------------------------------+
| SELECT SYSTEM_USER ( ) , HOST FROM `mysql` . `user` WHERE SYSTEM_USER = ?        |
+----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select statement_digest("select user(),host from mysql.user where user = 'lu9up'");
+-----------------------------------------------------------------------------+
| statement_digest("select user(),host from mysql.user where user = 'lu9up'") |
+-----------------------------------------------------------------------------+
| 12984e6ff7cbdbd28e2a377375af873fcd606891f82c670a74c04db83f7ac09c            |
+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)

二、mysqldumpslow操作

调用语法:

mysqldumpslow [options] [log_file ...]

options:

image.png

-s指定排序方式,默认是at,根据平均时间排序,共有七种排序方式:

image.png

mysqldumpslow操作示例

使用mysqldumpslow对慢查询日志文件进行分析,输出平均执行时间最久的两条查询:

[mysql@mysql001 ~]$ mysqldumpslow -s at -t 2 /disk1/data/mysql001-slow.log

Reading mysql slow query log from /disk1/data/mysql001-slow.log
Count: 1  Time=0.01s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  select f.title, count(*) as cnt
  from sakila.rental r
  join sakila.inventory i
  on r.inventory_id = i.inventory_id
  join sakila.film f
  on i.film_id = f.film_id
  where r.rental_date between 'S' and 'S'
  group by f.film_id
  order by cnt desc
  limit N

Count: 8  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=4.9 (39), root[root]@localhost
  show variables like 'S'

3 使用pt-query-digest解析慢查询日志

pt-query-digest是Percona Toolkit的一个工具,用于分析MySQL的慢查询日志文件、通用查询日志文件和二进制日志文件中的查询,也可以分析SHOW PROCESSLIST命令输出的结果和tcpdump抓取的MySQL协议数据(如:网络流量包)。默认情况下,对所有分析的查询按摘要分组,分析结果按查询时间降序输出。

官方参考文档:https://docs.percona.com/percona-toolkit/pt-query-digest.html

3.1 安装pt-query-digest

一、下载Percona Toolkit:

[mysql@mysql001 ~]$ wget percona.com/get/pt-query-digest

二、赋权

[mysql@mysql001 ~]$ chmod +775 pt-query-digest

完成赋权后就可以正常使用了。

3.2 语法和选项

语法:

pt-query-digest [OPTIONS] [FILES] [DSN]

选项:

optition namecomment
–ask-pass连接MySQL时提示输入密码。
–continue-on-error即使出现错误,也要继续解析,默认值时yes。该工具不会永远继续:一旦任何进程导致100个错误,它就会停止。
–create-review-table使用–review选项将分析结果输出到表中时,如果表不存在,创建它,默认值是yes。
–create-history-table使用–history选项将分析结果输出到表中时,如果表不存在,创建它,默认值是yes。
–defaults-file指定mysql的参数文件名,必须给出一个绝对路径名。
–explain使用此DSN对示例查询运行EXPLAIN并打印结果。
–filter该选项是一个Perl代码字符串或包含Perl代码的文件,使用此参数对要分析的文件进行过滤后再分析,将不符合Perl代码的时间全部忽略。
–review保存分析结果到表中,有重复的查询在表中时,不会再记录。只保存分析过的sql语句,不包含分析结果。
–history保存分析结果到表中,有重复的查询在表中时,也会记录,但时间不一样。与review不同,不仅保存分析的sql语句,也包含分析结果。
–limit将输出限制为给定的百分比或SQL语句数量。
–max-line-length把输出行的长度修剪到这个长度,0表示不裁剪。
–order-by按此属性和聚合函数对事件进行排序,默认为Query_time:sum。
–output指定分析结果的输出格式。
–since指定分析从什么时间开始的sql语句。
–until指定分析的sql语句的截至时间。
–type指定日志文件的类型,可以是genlog、binlog、slowlog、tcpdump、rawlog等。

选项的具体使用细则参考官方文档:https://docs.percona.com/percona-toolkit/pt-query-digest.html#options

3.3 用法示例

1)直接分析慢查询文件

[mysql@mysql001 output]$ pt-query-digest /disk1/data/mysql001-slow.log > slow`date +"%Y%m%d"`.log
[mysql@mysql001 output]$ ll
total 20
-rw-rw-r-- 1 mysql mysql 17819 Dec 20 22:51 slow20231220.log

2)分析网络流量包

从3306端口抓取1000个流量包输出到文件mysql.tcp.txt:

tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt

分析抓取的网路流量包:

pt-query-digest --type tcpdump mysql.tcp.txt> slow_report9.log

3)分析pocesslist的输出

pt-query-digest --processlist h = host1

4)保存分析过的sql语句到表中

pt-query-digest --review h=192.168.131.99 --no-report mysql001-slow.log

默认保存的表是percona_schema.query_review。

5)保存分析结果到表中

pt-query-digest --history h=192.168.131.99 --no-report mysql001-slow.log

默认保存的表是percona_schema.query_history。

相关文章:

一文搞懂MySQL索引

官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。看到这里,你是不是对于自己的sql语句里面的索引的有了更多优化想法呢。

ON DUPLICATE KEY UPDATE 导致mysql自增主键ID跳跃增长

具体解决方案可以根据项目来选择,如果项目不大,可以考虑1和2。如果不考虑高并发问题,可以考虑3。

mysql唯一索引与null

根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的,在oracel也是如此。在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。有上面的表和数据可以看出,查询多条数据。

MySQL主从复制(基于binlog日志方式)

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。主从复制的作用1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。3.读写分离,使数据库能支撑更大的并发。a.从服务器可以执行查询工作(就是我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)

MYSQL 主从复制 --- binlog

在 Master 端并不 Care 有多少个 Slave 连上了自己,只要有 Slave 的 IO 线程通过了连接认证,向他请求指定位置之后的 Binary Log 信息,他就会按照该 IO 线程的要求,读取自己的 Binary Log 信息,返回给 Slave 的 IO 线程。默认MySQL是未开启该日志的。如果读压力加大,就需要更多的 slave 来解决,但是如果slave的复制全部从 master 复制,势必会加大 master 的复制IO的压力,所以就出现了级联复制,减轻 master 压力。

MySQL 中 is null 和 =null 的区别

如果 set ANSI_NULLS为 ON 时,表示SQL语句遵循SQL-92标准;如果 set ANSI_NULLS 为 OFF 时,表示不遵从 SQL-92 标准。但SQL-92 标准要求对null的 = 或不等于 (!= ,) 比较取值都为 false,也就是 =null 或者 null,返回的都是false。null 在MySQL中不代表任何值,通过运算符是得不到任何结果的,因此只能用 is null(默认情况)MySQL 中 null 不代表任务实际的值,类似于一个未知数。

MySQL数据库查询语句之组函数,子查询语句

当一个SQL的执行需要借助另一个SQL的执行结果时,则需要进行SQL嵌套,该语法结构称之为子查询。先筛选出符合要求的数据,再对符合要求的数据进行分组时,分组的工作量会被减少,效率更高。先确定从哪张表进行操作-->对表中数据进行分组-->基于分组结果进行查询操作。执行顺序:优先执行小括号内的子SQL,根据子SQL的执行结果再执行外层SQL。执行顺序:from-->where-->group by-->select。执行顺序:from-->group by-->select。

mysql开启可以使用IP有权限访问

为实际的IP地址和你想要设置的密码。请小心操作,并确保你了解每个命令的作用。如果你对此有任何疑问,最好咨询经验丰富的数据库管理员。来设置或修改用户的密码。相反,你需要分两步来完成这个过程:首先创建或修改用户,并设置密码;然后授予相应的权限。用户应该能够从指定的内网IP地址访问MySQL服务器。用户已存在并且你只是想更改其密码或允许从另一个地址访问,使用。在MySQL 8.0及更高版本中,语句的语法有所变化。替换为你的内网IP地址,

雪花算法生成ID、UUID生成ID和MySql自增ID优缺点分析

综上所述,UUID适用于分布式系统和需要保密的场景,雪花ID适用于分布式系统和高并发环境,MySQL自增ID适用于单机系统和高效查询的场景。根据具体的业务需求和系统架构,选择合适的主键类型。通过本文的介绍和对比,希望读者能够更好地理解在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并能够根据实际情况做出明智的选择。在MySQL中,使用自增整数作为主键是一种常见的做法,因为它具有较小的存储空间、高效的索引和自动增长的特性。然而,具体选择何种主键类型还是要根据具体的业务需求和数据特点来决定。

【小白专用】C# 连接 MySQL 数据库

C# 连接 MySQL 数据库

如何用pthon连接mysql和mongodb数据库【极简版】

发现宝藏 前言 1. 连接mysql 1.1 安装 PyMySQL 1.2 导入 PyMySQL 1.3 建立连接 1.4 创建游标对象 1.5 执行查询 1.6 关闭连接 1.7 完整示例 2. 连接mongodb 2.1 安装 PyMongo 2.2 导入 PyMongo 2.3 建立连接 2.4

MySQL索引优化实战

对于这种varchar(255)的大字段可能会比较占用磁盘空间,可以稍微优化下,比如针对这个字段的前20个 字符建立索引,就是说,对这个字段里的每个值的前20个字符放在索引树里,类似于 KEY index(name(20),age,position)。此时你在where条件里搜索的时候,如果是根据name字段来搜索,那么此时就会先到索引树里根据name 字段的前20个字符去搜索,定位到之后前20个字符的前缀匹配的部分数据之后,再回到聚簇索引提取出来 完整的name字段值进行比对。

《mybatis》--大数据量查询解决方案

之前写百万以及千万的导出数据的时候,对于将数据写道csv文件并压缩这里没有什么大问题了,但是出现了其他问题为:1、我们需要将数据从数据库中拿出来,并且在进行装配的时候出现了一些问题。2、对于整体内存安全来说,如果直接将数据从数据库中拿出来百万级别以上的数据对于内存是非常不友好的。当问题出现比较大的时候会直接触发GC,造成瘫痪。目前开发以及项目测试的是更多的使用mybatis来进行开发的,所以本文章讨论以及解决的的就是如何使用mybaits来解决流式查询并单条处理的问题。

ClickHouse 与mysql等关系型数据库对比

先用一张图帮助理解两者的本质上的区。

Windows安装MySQL及网络配置

向日葵软件是一种远程控制软件,可以让用户在不同设备之间进行远程桌面访问和文件传输。用户可以通过向日葵软件,在任何具有互联网连接的设备上远程控制其他设备,包括计算机、智能手机和平板电脑。用户只需安装向日葵软件,并使用登录凭据连接到目标设备,就可以实时控制目标设备上的屏幕、键盘和鼠标。向日葵软件还提供了一些辅助功能,如文件传输、远程打印和远程会议等。这使得向日葵软件成为一个方便实用的远程协助工具,适用于个人用户、技术支持人员和企业用户等各种场景。

深入理解Mysql事务隔离级别与锁机制

我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。

MySQL是如何保证数据不丢失的?

上篇文章《InnoDB在SQL查询中的关键功能和优化策略》对InnoDB的查询操作和优化事项进行了说明。但是,MySQL作为一个存储数据的产品,怎么确保数据的持久性和不丢失才是最重要的,感兴趣的可以跟随本文一探究竟。

where查询条件的字段顺序打乱会影响命中索引吗?

答案是:不影响我们的where后边条件字段打乱会影响命中索引吗?先来进行下边的实验:可以看到实验结果,where条件字段顺序没有按照索引的字段顺序,依然不影响命中索引。因为Mysql中有查询优化器,会自动优化查询顺序。

MySQL删除会走索引吗

MySQL是关系型数据库管理系统的一种, 网站在进行数据的增删改查的时候,我们往往需要使用 MySQL 数据库。而删除操作就是在 MySQL 数据库中删除指定的数据或者表格的操作。

Linux多种方法安装MySQL

源码安装:优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错。使用官方编译好的二进制文件安装:优点是安装速度快,安装步骤简单,缺点是安装包很大,300M左右。yum安装。rpm安装。

Linux中mysql 默认安装位置&Linux 安装 MySQL

MySQL在Linux系统上的默认安装位置是目录。这是MySQL服务器的数据目录,包含所有数据库文件。通过检查MySQL二进制文件的路径,我们可以确认MySQL是否正确安装。在目录中,MySQL使用一系列文件和子目录来组织和存储数据。确保理解MySQL数据目录的结构对于管理和维护MySQL数据库至关重要。按照顺序安装即可解决。

MySQL数据库索引以及使用唯一索引实现幂等性

一次和多次请求某一个资源对于资源本身应该具有同样的结果任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

【微服务】mysql + elasticsearch数据双写设计与实现

在很多电商网站中,对商品的搜索要求很高,主要体现在页面快速响应搜索结果。这就对服务端接口响应速度提出了很高的要求。

基于 MySQL 多通道主主复制的机房容灾方案

文章中介绍了多种 MySQL 高可用技术,并介绍了根据自身需求选择多通道主主复制技术的过程和注意事项。

MySQL中的 增 删 查 改(CRUD)

文章浏览阅读1.8k次,点赞60次,收藏56次。insert into 表名 value(数据,数据),.......;可以单行,多行插入。​为查询结果的列取别名select 表达式/列名as 别名 from 表名;去重:DISTINCTselect distinct 单列/多列 from 表名;会去除查询结果中的重复项(只保留一项)select 条件查询的执行顺序遍历表中的每个记录把当前记录的值带入条件,根据条件进行筛选如果这条记录满足条件,保留并进行列上的表达式的计算如果有 order by 会在所有行都被获取到之后(表​

【MySQL从删库到跑路 | 基础第二篇】——谈谈SQL中的DML语句

详细介绍SQL中的DML语句(增加、修改、删除操作)。

【MySQL基础|第三篇】--- 详谈SQL中的DQL语句

详解MySQL中SQL的基础查询、条件查询、聚合函数、分组查询、排序查询、分页查询。

【MySQL函数篇】—— 字符串函数(超详细)

详细介绍MySQL函数中的字符串函数。

MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结

主要讲解MySQL中的字符串、日期、数值、流程函数。

详细介绍MySQL中的六种约束

详细介绍MySQL中的六种约束