|NO.Z.00139|——————————|BigDataEnd|——|Java&MySQL.高级.V11|——|MySQL.v11|慢查询日子介绍与配置|
一、慢查询日志分析
### --- 慢查询介绍
——> MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,
——> 用来记录在MySQL中响应时间超过阈值的语句。
——> 默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。
——> 如果不是调优需要的话,一般不建议启动该参数,
——> 因为开启慢查询日志会或多或少带来一定的性能影响。
——> 慢查询日志支持将日志记录写入文件和数据库表。
二、慢查询参数:执行下面的语句
mysql> SHOW VARIABLES LIKE "%query%";
+------------------------------+-----------------------------------+
| Variable_name | Value |
+------------------------------+-----------------------------------+
| binlog_rows_query_log_events | OFF |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+------------------------------+-----------------------------------+
### --- MySQL 慢查询的相关参数解释:
——> slow_query_log:是否开启慢查询日志, 1 表示开启, 0 表示关闭。
——> slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。
——> long_query_time: 慢查询阈值,当查询时间多于设定的阈值时,记录日志。
### --- 慢查询配置方式
~~~ 默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的
mysql> SHOW VARIABLES LIKE '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
~~~ # 可以通过设置slow_query_log的值来开启
mysql> set global slow_query_log=1;
mysql> SHOW VARIABLES LIKE '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
### --- 使用set global slow_query_log=1 开启了慢查询日志只对当前数据库生效,MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)
~~~ # 编辑配置
[root@localhost ~]# vim /etc/my.cnf
~~~ # 添加如下内容
slow_query_log =1
slow_query_log_file=/var/lib/mysql/localhost-slow.log
~~~ # 重启MySQL
[root@localhost ~]# systemctl restart mysqld
mysql> SHOW VARIABLES LIKE '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
### --- 那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢?
~~~ 这个是由参数long_query_time 控制,默认情况下long_query_time的值为10秒.
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
mysql> set global long_query_time=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
### --- 我修改了变量long_query_time,但是查询变量long_query_time的值还是10,
~~~ 难道没有修改到呢?注意:使用命令 set global long_query_time=1 修改后,
~~~ 需要重新连接或新开一个会话才能看到修改值。
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
### --- log_output 参数是指定日志的存储方式。log_output='FILE' 表示将日志存入文件,
——> 默认值是'FILE'。log_output='TABLE' 表示将日志存入数据库,
——> 这样日志信息就会被写入到mysql.slow_log 表中。
——> MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,
——> 如:log_output='FILE,TABLE'。日志记录到系统的专用日志表中,
——> 要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,
——> 又需要能够获得更高的系统性能,那么建议优先记录到文件.
mysql> SHOW VARIABLES LIKE '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
### --- 系统变量 log-queries-not-using-indexes :
~~~ 未使用索引的查询也被记录到慢查询日志中(可选项)。
~~~ 如果调优的话,建议开启这个选项。
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
mysql> set global log_queries_not_using_indexes=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON |
+-------------------------------+-------+
三、慢查询测试:执行 test_index.sql 脚本, 导入测试表

### --- 执行下面的SQL,执行超时 (超过1秒) 我们去查看慢查询日志
SELECT * FROM test_index WHERE hobby = '20009951' OR hobby = '10009931' OR hobby = '30009931';
### --- 日志内容
~~~ 我们得到慢查询日志后,最重要的一步就是去分析这个日志。
~~~ 我们先来看下慢日志里到底记录了哪些内容。
~~~ 如下图是慢日志里其中一条SQL的记录内容,可以看到有时间戳,用户,查询时长及具体的SQL等
~~~ # 模拟慢查询记录数据
mysql> select sleep(4)
-> ;
+----------+
| sleep(4) |
+----------+
| 0 |
+----------+
==> localhost-slow.log <==
# User@Host: root[root] @ [192.168.52.1] Id: 4
# Query_time: 1.681371 Lock_time: 0.000089 Rows_sent: 3 Rows_examined: 5000000
/usr/sbin/mysqld, Version: 5.7.35 (MySQL Community Server (GPL)). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
/usr/sbin/mysqld, Version: 5.7.35-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv005-mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通