ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 简介 默认情况,mysql没有开启慢查询日志,需要手动来开启. 查询是否开启 ~~~ show variables like '%slow_query_log%'; ~~~ 开启下 修改my.cnf文件,增加或修改参数`slow_query_log` 和`slow_query_log_file`后,然后重启MySQL服务器,如下所示 ~~~ slow_query_log =1 slow_query_log_file=/tmp/mysql_slow.log ~~~ 关于慢查询的参数`slow_query_log_file` ,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件`host_name-slow.log`(如果没有指定参数`slow_query_log_file`的话) --- ~~~ select sleep(3); ~~~ 那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? 这个是由参数`long_query_time`控制,默认情况下`long_query_time`的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。关于运行时间正好等于`long_query_time`的情况,并不会被记录下来。也就是说,在mysql源码里是判断大于`long_query_time`,而非大于等于。从MySQL 5.1开始,`long_query_time`开始以微秒记录SQL语句运行时间,之前仅用秒为单位记录。如果记录到表里面,只会记录整数部分,不会记录微秒部分。 --- 系统变量`log-queries-not-using-indexes`:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用`full index scan`的sql也会被记录到慢查询日志。 ~~~ mysql> show variables like 'log_queries_not_using_indexes'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ 1 row in set (0.00 sec) mysql> set global log_queries_not_using_indexes=1; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'log_queries_not_using_indexes'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | ON | +-------------------------------+-------+ 1 row in set (0.00 sec) ~~~ 系统变量`log_slow_admin_statements`表示是否将慢管理语句例如`ANALYZE TABLE`和`ALTER TABLE`等记入慢查询日志 ~~~ mysql> show variables like 'log_slow_admin_statements'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | log_slow_admin_statements | OFF | +---------------------------+-------+ 1 row in set (0.00 sec) ~~~ 查询有多少条慢查询记录,可以使用系统变量。 ~~~ mysql> show global status like '%Slow_queries%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Slow_queries | 2104 | +---------------+-------+ 1 row in set (0.00 sec) ~~~ # mysql配置 在`[mysqld]`下配置 ~~~ slow_query_log =1 slow_query_log_file=/tmp/mysql_slow.log long_query_time=3 log_output=FILE ~~~ `log_output`参数是指定日志的存储方式。`log_output='FILE'`表示将日志存入文件,默认值是'FILE'。 `log_output='TABLE'`表示将日志存入数据库,这样日志信息就会被写入到`mysql.slow_log`表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:`log_output='FILE,TABLE'`。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。 # 日志分析工具 ~~~ mysqldumpslow [参数] [日志文件] ~~~ **参数** ~~~ 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 ~~~