慢日志主要是用于以文本形式记录数据库服务运行过程中,执行过程较慢的语句;
利用慢日志信息生成的信息,可以在日常巡检过程中,通过日志定位SQL语句性能问题;
01 日志信息基本配置
mysql> select @@slow_query_log;
+-------------------------+
| @@slow_query_log |
+-------------------------+
| 0 |
+-------------------------+
1 row in set (0.00 sec)
-- 此参数配置信息,表示是否激活启动慢日志记录功能,默认处于关闭状态
mysql> select @@slow_query_log_file;
+--------------------------------------------+
| @@slow_query_log_file |
+--------------------------------------------+
| /data/3306/data/xiaoQ-01-slow.log |
+--------------------------------------------+
1 row in set (0.00 sec)
-- 此参数配置信息,表示慢日志文件保存的路径信息;建议日志文件路径与数据存放路径进行分离;
mysql> select @@long_query_time;
+---------------------------+
| @@long_query_time |
+---------------------------+
| 10.000000 |
+---------------------------+
1 row in set (0.00 sec)
-- 此参数信息配置,表示记录慢日志的条件,默认是大于10s执行的语句,就会记录为慢查询语句;(建议时间为0.01~0.1)
mysql> select @@log_queries_not_using_indexes;
+---------------------------------------------+
| @@log_queries_not_using_indexes |
+---------------------------------------------+
| 0 |
+---------------------------------------------+
1 row in set (0.00 sec)
-- 此参数信息配置,表示慢日志中会记录没有使用索引的语句信息;
# 修改日志默认状态(激活日志):
mysql> set global slow_query_log=1;
mysql> set global long_query_time=0.01;
mysql> set global log_queries_not_using_indexes=1;
-- 可以对以上参数信息进行在线调整,也可以将以上参数编写到数据库my.cnf配置文件中,作为永久配置;
02 日志应用配置核实
mysql> use oldboy;
mysql> show index from t100w;
mysql> alter table t100w drop index idx;
-- 删除数据表中索引信息
mysql> select * from t100w limit 100;
mysql> select * from t100w where id=10;
mysql> select * from t100w where id=20;
mysql> select count(*) from t100w group by num limit 10;
...
-- 模拟执行慢查询的操作语句
# 查看核实慢日志文件是否生成
[root@xiaoQ-01 ~]# ll /data/3306/data/xiaoQ-01-slow.log
-rw-r----- 1 mysql mysql 6842 11月 22 23:54 /data/3306/data/xiaoQ-01-slow.log
[root@xiaoQ-01 ~]# cat /data/3306/data/xiaoQ-01-slow.log
/usr/local/mysql/bin/mysqld, Version: 8.0.26 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
# Time: 2022-11-22T15:41:03.849261Z
# User@Host: root[root] @ localhost [] Id: 490
# Query_time: 0.000446 Lock_time: 0.000143 Rows_sent: 100 Rows_examined: 100
use oldboy;
SET timestamp=1669131663;
select * from t100w limit 100;
# Time: 2022-11-22T15:41:05.677310Z
# User@Host: root[root] @ localhost [] Id: 490
# Query_time: 0.000282 Lock_time: 0.000083 Rows_sent: 100 Rows_examined: 100
SET timestamp=1669131665;
select * from t100w limit 100;
# Time: 2022-11-22T15:41:06.630012Z
# User@Host: root[root] @ localhost [] Id: 490
# Query_time: 0.000242 Lock_time: 0.000075 Rows_sent: 100 Rows_examined: 100
SET timestamp=1669131666;
select * from t100w limit 100;
-- 会按照执行语句的操作时间顺序,进行慢查询日志信息的记录;
03 日志信息分析方法
[root@xiaoQ-01 data]# mysqldumpslow -s c -t 3 /data/3306/data/xiaoQ-01-slow.log
-- 按照慢查询语句的重复执行次数(c)进行排序(-s),取出其中靠前(t)的前三名慢查询语句
-- 还可以扩展使用pt-query-digest更好的分析慢查询日志,支持图形化展示
-- what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time