什么是慢查询日志?
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
注意:开启慢查询会带来CPU损耗与日志记录的IO开销,所以只有在必要的时候才打开慢查询日志来查看SQL运行状态。
执行时间慢的SQL会带来什么影响?
每个 SQL 执行都需要消耗一定 I/O 资源,SQL 执行的快慢,决定系统资源被占用时间的长短,如果慢查询的语句过多,导致占用的资源过多,那么所有新的 SQL 执行将会被阻塞,而其他需要系统资源的程序都将无法正常运行。
同时也会降低用户体验度。
开启慢查询
mysql> show variables like '%slow%';//查看慢查询相关配置
+---------------------------+-----------------------------------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------------------------------+
| log_slow_admin_statements | OFF//将慢管理语句例如OPTIMIZE TABLE、ANALYZE TABLE和ALTER TABLE记入慢查询日志。 |
| log_slow_extra | OFF//mysql8加入的配置, 启用log_slow_extra系统变量(从MySQL 8.0.14开始可用)会导致服务器将以下额外字段写入文件输出(不影响表输出)。 |
| log_slow_slave_statements | OFF//记录由Slave所产生的慢查询 |
| slow_launch_time | 10 //慢查询语句记录阀值,默认是10s
| slow_query_log | OFF //是否开启慢查询日志 |
| slow_query_log_file | /usr/local/var/mysql/ChrisLeedeMacBook-Pro-slow.log |
+---------------------------+-----------------------------------------------------+
6 rows in set (0.00 sec)
mysql> set global slow_query_log='ON';//启用慢查询
mysql> set global slow_query_log_file=’xxx’;//设置日志目录
mysql> set global long_query_time=2; //修改慢查询时间
mysql> set global log_queries_not_using_indexes=1;//记录没有使用索引查询的语句
查看慢查询日志
在这之前,我们已经运行了一个查询时间为26秒的语句,全表查150万行数据。

接下来到我们的慢查询日志路径
/usr/local/var/mysql/ChrisLeedeMacBook-Pro-slow.log
查看文件的内容:
$ cat ChrisLeedeMacBook-Pro-slow.log
/usr/local/opt/mysql/bin/mysqld, Version: 8.0.21 (Homebrew). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
Time: 2020-12-05T15:56:52.608349Z
User@Host: root[root] @ localhost [127.0.0.1] Id: 43
Query_time: 26.442570 Lock_time: 0.000055 Rows_sent: 1520562 Rows_examined: 1520562
use test;
SET timestamp=1607183786;
/* ApplicationName=PhpStorm 2020.2.3 */ SELECT * from bill;
/usr/local/opt/mysql/bin/mysqld, Version: 8.0.21 (Homebrew). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
查询分析工具mysqldumpslow
该工具是慢查询自带的分析慢查询工具,一般只要安装了 mysql,就会有该工具;
mysqldumpslow用法:
mysqldumpslow[OPTS...][LOGS...] --后跟参数以及log文件的绝对地址;
-s 按照那种方式排序
c:访问计数
l:锁定时间
r:返回记录
al:平均锁定时间
ar:平均访问记录数
at:平均查询时间
-t 是top n的意思,返回多少条数据。
-g 可以跟上正则匹配模式,大小写不敏感。
最后,优化完查询语句后,记得关闭慢查询,避免CPU资源损耗