|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

 

 

posted on   yanqi_vip  阅读(19)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示