慢查询日志并不是说这个日志有多慢,而是将数据库中所有执行比较慢是SQL语句记录在这个日志中,我们可以根据慢查询日志中记录的SQL,去分析和优化这个慢SQL。
什么样的语句才会被记录到慢查询日志呢?
开启慢查询日志最好配置在MySQL的配置文件中,当然也可以在交互模式通过变量来开启,但是重启后会失效,建议配置在主配置文件中。
慢查询日志默认情况下是没有开启的。
mysql> select @@slow_query_log;
+------------------+
| @@slow_query_log |
+------------------+
| 0 |
+------------------+
开启慢查询日志。
[root@mysql ~]# vim /etc/my.cnf
slow_query_log=1 #开启慢查询日志
slow_query_log_file=/data/mysql/slow.log #慢查询日志的路径
long_query_time=10 #慢查询日志的阈值,当SQL查询达到10秒后则被记录
log_queries_not_using_indexes #将没有走索引的查询SQL也记录到慢查询日志中
[root@mysql ~]# systemctl restart mysqld
MySQL有一个自带的慢日志分析工具mysqldumslow,通过这个命令可以分析慢日志。
通过-t参数分析前10个慢查询SQL,主要分析慢SQL在数据库范围中执行的次数(Count)和执行的时间(Time),通过列出的慢SQL语句经过分析后进行优化。
[root@mysql ~]# mysqldumpslow -s -c -t 10 /data/mysql/slow.log
Reading mysql slow query log from /var/lib/mysql/mysql-slow.log
Count: 1 Time=135.46s (135s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
load data local infile 'S' into table tb_user fields terminated by 'S' lines terminated by 'S'
Count: 1 Time=128.37s (128s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
load data local infile 'S' into table tb_user_100w fields terminated by 'S' lines terminated by 'S'
Count: 2 Time=3.39s (6s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@localhost
select * from xscjb limit N
Count: 1 Time=38.43s (38s) Lock=0.00s (0s) Rows=27126.0 (27126), root[root]@[192.168.20.118]
select * from dabiao
Died at /usr/bin/mysqldumpslow line 162, <> chunk 5.