慢SQL探秘之为什么我的SQL很慢却没记录在慢查询日志里

在MySQL数据库中,想了解数据库运行情况的重要指标之一是慢SQL。而并非如某些人所说的所有运行慢的SQL都会被记录在慢SQL日志(或日志表)里,抑或是没有慢SQL就代表没有运行慢的SQL。本文将总结一些比较常见的运行比较慢但不会被记录在慢SQL日志里的情况。另外,慢SQL的计算方式在MySQL8.0新版本中有变化,因此,将通过对比MySQL5.7(MySQL5.7.38)与MySQL8.0(MySQL8.0.33)进行总结。

1.  准备工作

部署了两套环境,分别是MySQL5.7(MySQL5.7.38)版本及MySQL8.0(MySQL8.0.33)版本。另外为了后续进行慢SQL测试,此时先创建一张测试表并清空慢SQL日志表。

1.1 创建测试表及数据

创建测试表及测试数据,便于后续测试。本次通过创建一张1000W记录的表进行测试,快速生成数据的方式请查看历史文章:效率提升16800倍的连续整数生成方法

然后再添加个字段

mysql> call sp_createNum(10000000);
Query OK, 1611392 rows affected (38.70 sec)


mysql> select  count(*) from  testdb.nums;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (3.70 sec)


mysql> alter table testdb.nums add c1 varchar(20);
Query OK, 0 rows affected (17.83 sec)
Records: 0  Duplicates: 0  Warnings: 0

1.2 清空慢SQL日志表

测试前先清空慢SQL日志表mysql.slow_log,清空方法如下:

mysql> select  count(*) from mysql.slow_log;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
# 需先关闭慢SQL监控开关
mysql> set global slow_query_log=0;
Query OK, 0 rows affected (0.00 sec)


# truncate 方式清空慢SQL日志表
mysql> truncate table  mysql.slow_log;
Query OK, 0 rows affected (0.00 sec)


mysql> select  count(*) from mysql.slow_log;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
# 清理完毕后开启慢SQL监控
mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.00 sec)

2.  未开启慢SQL监控

查看MySQL是否开启MySQL的方法如下:

mysql> SHOW GLOBAL VARIABLES LIKE 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | ON    |
+----------------+-------+
1 row in set (0.00 sec)

其中value值为ON (或1),则代表开启了慢SQL监控。MySQL各个版本查看的方法均一样09039fba013b6205765f830ac4969a0a.png

另外和慢SQL相关的其他主要参数如下:

  • slow_query_log: 这个参数用于启用或禁用慢SQL监控。设置为1表示启用,0表示禁用。默认值为0(禁用)。

  • log_output:日志存储方式(不仅仅是慢SQL日志),默认值为'FILE'。当log_output='FILE'表示将日志存入文件;当log_output='TABLE'表示将日志存入数据库中的mysql.slow_log表里;当log_output='FILE,TABLE'表示既存储到日志文件又存储到mysql.slow_log表里

  • slow_query_log_file: 慢SQL日志文件的路径和文件名(5.5等低版本参数为log_slow_queries)。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log。

  • long_query_time: 用于定义慢SQL的阈值时间,单位为秒。执行时间超过该阈值的SQL语句将被记录到慢SQL日志中。默认值为10秒。

  • log_queries_not_using_indexes:如果设置为1,则将未使用索引的查询也记录到慢查询日志中。默认值为0(禁用)。

  • log_slow_admin_statements: 如果设置为1,则会记录部分管理命令(例如ALTER TABLE)到慢SQL日志中。默认值为0(禁用),本文后续也会继续演示介绍。

  • log_slow_extra: 如果设置为1,则除了慢SQL日志的标准输出之外,还将在日志中包括额外的信息,如用户、主机、客户端命令等。默认值为0(禁用)。

  • log_slow_slave_statements: 如果设置为1,则将从服务器执行的慢SQL记录到主服务器的慢SQL日志中。默认值为0(禁用)。

  • min_examined_row_limit: 仅在查询的行数超过指定值时,才记录到慢SQL日志中。默认值为0,表示不限制。

3.  SQL运行时间小于慢SQL监控阈值时间

第一部分已经介绍了和慢SQL相关的参数中的long_query_time,即慢SQL阈值。所以,当SQL运行时间小于该阈值时,对于的SQL将不会记录在慢SQL日志中。查看和修改慢SQL监控阈值的方法如下:

# 查看慢SQL阈值
mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.500000 |
+-----------------+----------+
1 row in set (0.00 sec)
# 设置慢SQL阈值
mysql> set global long_query_time=0.6;
Query OK, 0 rows affected (0.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库干货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值