一、什么是Mysql慢查询日志
-
MySQL慢查询日志是MySQL数据库自带的一个功能,用于记录执行时间超过指定阈值的SQL语句,以便于后续的性能优化工作
-
帮助开发和DBA发现哪些SQL语句需要优化,在哪些地方需要修改,以提高数据库的性能
-
默认情况下MySQL数据库是不开启慢查询日志的,long_query_time 的默认值为10(即10秒,通常设置为1秒)
二、配置开启Mysql慢查询日志
配置慢查询日志之前,我们可以先查看一下默认情况下慢查询日志的开启情况:
show variables like 'slow%'
可以看到默认情况下 slow_query_log 属性是OFF,处于关闭状态
开启慢查询日志有两种方式
第一种是通过set 语句来开启,这种方式 mysql服务重启的话,配置会失效
第二种是通过配置文件的方式来开启,这种方式是永久生效的,mysql重启也不影响
1、通过set 语句来开启慢查询日志
- 开启慢查询日志:
set global slow_query_log = on
- 自定义慢查询日志文件的存放路径:
set global slow_query_log_file = '自定义路径'
- 设置慢查询时间阈值:
开启了慢查询日志后,还需要设置一下慢查询的时间阈值,就是配置一下你认为多慢才算慢查询
先通过以下语句来看下 这个时间默认是多久:
show variables like '%long%'
可以看到,long_query_time 属性,默认值为10.000000,表示只记录查询时间在10秒以上的语句
所以这个时间咱们需要自定义的配置一下,那一般配置多久合理呢?
一般情况下,数据不多的话,慢查询的临界值设置为0.02秒比较合理
但是如果数据里比较大的话,一般超过500毫秒,也就是0.5秒就算慢查询
所以,咱们可以通过以下语句,来先把这个时间设置为0.02秒
set long_query_time=0.02
2、通过配置文件的方式来开启慢查询日志
进入mysql的配置文件进行配置
vim /mydata/mysql/conf/my.cnf
把下面的配置复制进去
[mysqld]
slow_query_log = 1
long_query_time = 0.1
slow_query_log_file =/usr/local/mysql/mysql_slow.log
重启mysql生效
docker restart mysql
注意:有可能重启后,发现其他两项都生效了,但是slow_query_log 属性仍然是OFF
这有可能是你自定义指定的慢查询日志文件没读写权限,chmod 赋一下权限就可以了
好了,配置好之后,再通过命令,看下配置好之后的状态
三、模拟慢查询,看记录慢查询日志是否生效
- 执行sql语句,来模拟慢查询
select sleep(2);
select sleep(5);
- 进入容器查看 慢查询是否记录到日志文件里了
docker exec -it mysql /bin/bash
使用cat 来查看日志文件
cat /usr/local/mysql/mysql_slow.log
可以看到,超过咱们配置的0.1秒的sql语句都会被记录到指定的慢查询日志文件里
下面来简单的解读一下这个日志文件的大概内容
Time: 表示日志记录的时间。格式为 ISO8601 标准的 UTC 时间。
User@Host: 表示执行该SQL语句的用户和主机名。
Id: 表示线程 ID,是一个整数表示。
Query_time: 表示 SQL 语句的执行时间,以秒为单位。
Lock_time: 表示在执行 SQL 语句期间等待锁定资源的时间。如果 SQL 语句没有使用锁,则为 0。
Rows_sent: 表示 SQL 语句返回的行数。
Rows_examined: 表示查询过程中扫描的行数。如果 SQL 语句没有执行查询操作,则该值为 0。
timestamp: 表示该 SQL 语句的执行时间戳,以秒为单位。
sql语句: 实际执行的SQL语句。
ok,到这里就配置好了mysql的慢查询日志
记录了慢查询的sql后,就可以定期的去查看,去分析一下这些sql为什么慢的原因,那怎么具体的分析慢查询的sql语句呢?下一篇我会详细讲一下mysql中的explain执行计划,用explain里的内容就可以大致分析出这个sql查询的质量高不高,以及怎么去加索引优化