32. Mysql之慢日志浅谈
1.前言
关于慢日志的有关介绍我在前面的第12小节有说过,https://www.cnblogs.com/zmc60/p/14940585.html ,这里主要是说慢日志的几个参数对记录慢日志的影响
2.慢日志参数回顾
slow_query_log=1 #是否启用慢查询日志,1为启用,0为禁用 slow_query_log_file=slow.log #指定慢查询日志文件的路径和名字,可使用绝对路径指定;默认值是'主机名_slow.log',位于datadir目录 long_query_time=2 #SQL语句运行时间阈值,执行时间大于参数值的语句才会被记录下来 min_examined_row_limit=100 #SQL语句检测的记录数少于设定值的语句不会被记录到慢查询日志,即使这个语句执行时间超过了long_query_time的阈值 log_queries_not_using_indexes=1 #将没有使用索引的语句记录到慢查询日志 log_throttle_queries_not_using_indexes=10 #设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间 log-slow-admin-statements=1 #记录执行缓慢的管理SQL,如alter table,analyze table, check table, create index, drop index, optimize table, repair table等。 log_slow_slave_statements=0 #记录从库上执行的慢查询语句 log_timestamps=system #5.7版本新增时间戳所属时区参数,默认记录UTC时区的时间戳到慢查询日志,应修改为记录系统时区 log_output=FILE,TABLE #指定慢查询日志的输出方式,从5.5版本开始可以记录到日志文件(FILE,慢查询日志)和数据库表(TABLE,mysql.slow_log)中
补充:慢日志的记录方式有两种,一种是记录在磁盘文件中,还有一种是记录在mysql.slow_log表中的,具体是哪一种,主要是由参数log_output决定的
mysql> show variables like '%log_out%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+
该参数有两个选项可以选择,一种是FILE,另外一种就是TABLE。
查看慢日志位置:show variables like '%slow_query_log_file%';
慢日志常用的分析工具: 一种是自带的mysqldumpslow,另一种是percona公司出品的pt-query-digest
mysqldumpslow方法:
常用命令:
返回平均查询时间前5的SQL: mysqldumpslow -s at -t 5 /data/mysql/data/node1-slow.log 返回累计查询时间前5的SQL:mysqldumpslow -s t -t 5 /data/mysql/data/node1-slow.log 返回总次数前5的SQL:mysqldumpslow -s c -t 5 /data/mysql/data/node1-slow.log
慢日志内容
Time Id Command Argument # Time: 2023-07-31T21:34:47.169644+08:00 # User@Host: root[root] @ localhost [] Id: 11 # Query_time: 0.005322 Lock_time: 0.000333 Rows_sent: 4079 Rows_examined: 4079 Thread_id: 11 Errno: 0 Killed: 0 Bytes_received: 0 Bytes_sent: 161078 Read_first: 1 Read_last: 0 Read_key: 1 Read_next: 0 Read_prev: 0 Read_rnd: 0 Read_rnd_next: 4080 Sort_merge_passes: 0 Sort_range_count: 0 Sort_rows: 0 Sort_scan_count: 0 Created_tmp_disk_tables: 0 Created_tmp_tables: 0 Start: 2023-07-31T21:34:47.164322+08:00 End: 2023-07-31T21:34:47.169644+08:00 use world; SET timestamp=1690810487; select * from city;
上面字段解释:
Time:log记录的时间; User@Host:SQL执行的用户以及主机; id:连接的标识,这里指的是processlist id. Query_time:SQL执行的时间; Lock_time:获取锁的时间; Rows_sent:返回客户端的结果行数; Rows_examined:server层检查的行数; Thread_id:连接的标识; Errno:SQL错误号,0表示没有错误; Killed:语句终止的错误号,0表示正常终止; Bytes_received/sent:收到和发送的字节数; Read_first:Handler_read_first的值,代表读取索引中第一个条目的次数。反映查询全索引扫描的次数。 Read_last:读取索引最后一个key的次数; Read_key:基于key读取行的请求数,较大说明使用正确的索引 Read_next:按顺序取下一行数据的次数,索引范围查找和索引扫描时该值会增大; Read_prev:按顺序读取上一行的请求数,order by desc查询较优时该值较大; Read_rnd:按固定位置读取行的请求数,大量的回表、没有索引的连接和对结果集排序时会增加; Read_rnd_next:读取数据文件下一行的次数,大量表扫描、未创建或合理使用索引时会增加; Sort_range_count:使用范围完成的排序次数; Sort_rows:排序的行数; Sort_scan_count:通过扫描表完成的排序次数; Sort_merge_passes:排序算法合并的次数,如该值较大考虑增加sort_buffer_size的值 Created_tmp_disk_tables:创建内部磁盘临时表的数量; Created_tmp_tables:创建内部临时表的数量; Start/End:语句开始和结束时间
官方文档:https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html
pt-query-digest方法
官方文档:https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html