慢日志用于记录执行时间超过指定阈值的SQL,对于系统监控和调优非常有意义。
1.开启慢日志
slow_query_log=0|1,0为关闭,1为开启;
slow_query_log_file=file_name,指定慢日志文件名,默认名字为host_name-slow.log,如果不是绝对路径,那么默认存放在datadir目录下;
log_output=table|file|none,table表示慢日志信息存放在mysql.slow_log数据表里;file表示慢日志信息存放在磁盘文件上,由上述slow_query_log_file指定;如果是none,即使开启了慢日志功能,也不会记录任何慢SQL;如果不指定为file,即使设置了slow_query_log_file也是无效的。
例如:
--开启slow log
set @@global.slow_query_log=1;
--设置slow log文件名,默认放在数据目录下
set @@global.slow_query_log_file=slow_log;
--设置将慢日志同时记录到数据表和磁盘文件中
set @@global.log_output='TABLE,FILE';
2.什么SQL会记录到慢日志里
一个SQL的快慢并没有绝对的评判标准,在OLAP里,有10秒SQL也不算慢,但在OLTP里,在某些业务场景里,也许1秒的SQL已经算是严重的性能问题。
所以在MySQL里,慢日志记录的慢SQL,评判标准可以自定义,由以下几个参数来决定。
1.long_query_time
该参数定义一个SQL的执行时间阈值,单位为秒,默认是10,最小值为0,可以指定0.1表示100ms。
2.min_examined_row_limit
该参数定义一个SQL所读取的数据行数;
3.log_queries_not_using_indexes
该参数决定是否记录未使用索引的SQL;
4.log_slow_admin_statements
该参数决定是否记录管理类的命令,有 ALTER TABLE,ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,REPAIR TABLE,默认是不记录这一类语句到慢日志。
5.log_throttle_queries_not_using_indexes
该参数决定每分钟记录未使用索引的SQL的数量上限,因为未使用索引的SQL可能会非常多,导致慢日志空间增长飞快。
6.log_slow_slave_statements
该参数在从库上设置,决定是否记录在复制过程中超过long_query_time的SQL,如果binlog格式是row,则即使开启了该参数,也不会记录相关SQL。
那么一个SQL被记录到慢日志里,需要满足以下条件:
1.管理类语句不会记录,除非开启了log_slow_admin_statements;
2.执行时间需要超过long_query_time,或者对于未使用索引的SQL,需要开启log_queries_not_using_indexes,并且记录数量在log_throttle_queries_not_using_indexes之下;
3.SQL需要读取数据行数超过min_examined_row_limit;
4.从库的复制语句默认不记录,除非binlog格式是statement且开启log_slow_slave_statements。
3.慢日志的存放位置
慢日志可以存放磁盘文件,也可以存放在mysql.slow_log,表结构如下:
+----------------+---------------------+------+-----+----------------------+--------------------------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------------+------+-----+----------------------+--------------------------------+
| start_time | timestamp(6) | NO | | CURRENT_TIMESTAMP(6) | on update CURRENT_TIMESTAMP(6) |
| user_host | mediumtext | NO | | NULL | |
| query_time | time(6) | NO | | NULL | |
| lock_time | time(6) | NO | | NULL | |
| rows_sent | int(11) | NO | | NULL | |
| rows_examined | int(11) | NO | | NULL | |
| db | varchar(512) | NO | | NULL | |
| last_insert_id | int(11) | NO | | NULL | |
| insert_id | int(11) | NO | | NULL | |
| server_id | int(10) unsigned | NO | | NULL | |
| sql_text | mediumblob | NO | | NULL | |
| thread_id | bigint(21) unsigned | NO | | NULL | |
+----------------+---------------------+------+-----+----------------------+--------------------------------+
存放位置通过log_output控制,取值可以为table|file|none,默认是file,可以同时设置table和file选项,log_output=table,file
4.慢日志信息样例
1.slow_log表
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+-----+----------------+-----------+-----------+---------------------------+-----------+
| start_time | user_host | query_time | lock_time | rows_sent | rows_examined | db | last_insert_id | insert_id | server_id | sql_text | thread_id |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+-----+----------------+-----------+-----------+---------------------------+-----------+
| 2019-05-07 11:51:46.270304 | root[root] @ localhost [] | 00:00:00.366980 | 00:00:00.015808 | 1 | 280777 | sam | 0 | 0 | 128 | select count(*) from test | 4 |
+----------------------------+---------------------------+-----------------+-----------------+-----------+---------------+-----+----------------+-----------+-----------+---------------------------+-----------+
2.慢日志文件
[root@master data]# mysqldumpslow master-slow.log
Reading mysql slow query log from master-slow.log
Count: 1 Time=0.35s (0s) Lock=0.02s (0s) Rows=1.0 (1), root[root]@localhost
select count(*) from test