一、什么是慢查询日志?
慢查询日志官方给出的理解太费劲了,本博主,按照日常思维进行一下讲解吧,慢查询日志顾名思义,就是查询慢的日志记录啊,我们在数据库中的增删改查等操作,如果执行时间超过了数据库中慢查询设置的默认查询时间之后,就会把这些执行较慢的sql记录到日志中,像这样的日志叫做慢查询日志。这么一说,大家应该比较好理解了吧,哈哈。
二、慢查询有哪些参数配置?
MySQL 慢查询的相关参数解释:slow_query_log :是否开启慢查询日志,on表示开启,0ff表示关闭
1、slow_query_log
是否开启慢查询日志,1表示开启,0表示关闭。
2、log-slow-queries
旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
3、slow-query-log-file
新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
4、long_query_time
慢查询阈值,当查询时间多于设定的阈值时,记录日志。一般设置成1s或者2s
5、log_queries_not_using_indexes
未使用索引的查询也被记录到慢查询日志中(可选项)。
6、log_output:
日志存储方式。
(1)log_output=
'FILE'
表示将日志存入文件,默认值是
'FILE'
。
(2)log_output=
'TABLE'
表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。
(3)MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=
'FILE,TABLE'
。
(4)日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。
三、慢查询日志在哪里查?
1、首先我们需要先查看下数据库中的配置中是否开启了慢查询并且将慢查询日志输出到哪里了,要不然鬼才知道它在哪里呢?具体的查看方法如下:
(1)登录mysql数据库,mysql -uroot -p -hxxxx
(2)查看慢查询是否开启:
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启,如下所示:
mysql> show variables like '%slow_query_log%'; +---------------------+------------------------------------------+ | Variable_name | Value | +---------------------+------------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /usr/local/mysql/data/localhost-slow.log | +---------------------+------------------------------------------+ 2 rows in set (0.00 sec) mysql> set global slow_query_log=1; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%slow_query_log%'; +---------------------+------------------------------------------+ | Variable_name | Value | +---------------------+------------------------------------------+ | slow_query_log | ON | | slow_query_log_file | /usr/local/mysql/data/localhost-slow.log | +---------------------+------------------------------------------+ 2 rows in set (0.00 sec) #使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此),下面的操作我们在my.cnf中添加
(3)开启慢查询并设置存储方式:
slow_query_log =1
log_output = file
(4)自定义设置慢查询存储的路径
slow_query_log_file=/data/mysql/mysql-slow.log
(5)自定义设置慢查询请求时间的配置为1s
long_query_time = 1
(6)重启mysql服务器之后查看参数是否设置成功
/etc/init.d/mysqld restart
使用以下方式进行查看即可:
show variables like '参数名称';
四、使用mysqldumpslow来分析慢查询日志
[root@localhost~]# mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER 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 -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time mysqldumpslow --help
-s, 是表示按照何种方式排序
c: 访问计数
l: 锁定时间
r: 返回记录
t: 查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
-t, 是top n的意思,即为返回前面多少条的数据;
-g, 后边可以写一个正则匹配模式,大小写不敏感的;
比如:
得到返回记录集最多的10个SQL。
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log
得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log
得到按照时间排序的前10条里面含有左连接的查询语句。
mysqldumpslow -s t -t 10 -g “left
join
” /database/mysql/mysql06_slow.log
另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现刷屏的情况。
mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more