当前位置: 首页 > 科技观察

MySQL慢日志全解析!

时间:2023-03-21 13:43:02 科技观察

本文转载自微信公众号“MySQL技术”,作者MySQL技术。转载本文请联系MySQL技术公众号。前言:慢日志在日常数据库运维中经常用到。我们可以通过查看慢日志获取低效的SQL,进而进行SQL优化。本篇我们来了解一下慢日志。一、慢日志简介慢日志的全称是慢查询日志(SlowQueryLog),主要用于记录MySQL中执行时间超过指定时间的SQL语句。通过慢查询日志,可以找出哪些语句执行效率低,进行优化。默认情况下,MySQL不开启慢速日志,您可以通过修改slow_query_log参数来开启慢速日志。慢日志相关参数介绍如下:slow_query_log:是否开启慢查询日志,默认为0,可设置为0、1、1表示开启。slow_query_log_file:指定慢查询日志的位置和名称。默认值为host_name-slow.log,可以指定绝对路径。long_query_time:慢查询执行时间阈值,超过这个时间会记录,默认10,单位s。log_output:慢查询日志输出目标,默认为file,即输出到文件。log_timestamps:主要控制errorlog、slowlog、generalog日志文件中的显示时区。默认使用UTC时区。建议改成SYSTEM系统时区。log_queries_not_using_indexes:是否记录所有不使用索引的查询语句,默认关闭。min_examined_row_limit:对于扫描行数小于该参数的SQL,不记录到慢查询日志中,默认为0。log_slow_admin_statements:是否将慢管理语句写入慢日志。管理语句包括altertable、createindex等,默认是off,即不写入。一般情况下,我们只需要开启慢速日志记录,配置下限阈值时间,其余参数默认配置即可。对于阈值时间,可以灵活调整,比如可以设置为1s或者3s。2.慢日志实战在配置文件中,我们可以设置如下慢日志相关参数:#慢查询日志相关配置,可以修改vim/etc/my.cnf[mysqld]slow_query_log=1slow_query_log_file=/data/mysql/logs/slow.loglong_query_time=1log_timestamps=SYSTEMlog_output=FILE接下来我们仔细看看slowlog中会记录什么?下面我们执行一个较慢的查询SQL,看看它在慢日志中是如何体现的。#SQL执行时间超过阈值#Time:2021-05-13T17:38:03.687811+08:00#User@Host:root[root]@[192.168.85.0]Id:2604943#Query_time:1.099889Lock_time:0.000144Rows_sent:39Rows_examined:45305SETtimestamp=1620898683;select*fromtest_tablewherecol_namelike'%test%';如果启用慢速查询日志记录并选择FILE作为输出目标,则写入日志的每个语句都以#字符开头。对于每组慢SQL,第一行记录SQL执行的时间(如果log_timestamps参数为UTC,则时间显示为UTC时区),第二行记录执行该语句的用户和IP以及Linkid,第三行几个字段解释如下:Query_time:duration语句执行时间,单位秒。Lock_time:duration获取锁的时间(以秒为单位)。Rows_sent:N发送给客户端的行数。Rows_examined:N服务器层检查的行数(不计算存储引擎内部的任何处理)。下面两行是语句执行时的时间戳和具体的慢SQL。在实际环境中,不建议开启log_queries_not_using_indexes参数,可能会导致慢日志快速增长。对于慢日志的筛选分析,我们可以使用mysqldumpslow、pt-query-digest等工具进行分析。对于慢日志文件,需要定期归档。比如可以暂时关闭慢日志,重命名旧文件,然后再打开慢日志,这样就会写入新的日志文件,有效减少日志体积。