什么是慢查询日志?

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资源损耗