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

如何定位MySQL慢查询?

时间:2023-03-22 11:31:30 科技观察

相信大家在日常工作中都有SQL优化的经验,所以在优化之前,一定要先发现慢SQL再分析。本文介绍如何定位慢查询。慢查询日志是MySQL的一个内置特性,可以记录执行超过指定时间的SQL语句。下面是慢查询的相关参数。有兴趣的可以看看:参数含义log_output日志输出位置,默认为FILE,即保存为文件。如果设置为TABLE,日志将记录在mysql.show_log表中,支持设置多种格式slow_query_log_file指定慢查询日志文件的路径和名称,可以使用绝对路径指定。默认值为hostname-slow.log,位于配置的datadir目录中。秒,默认为10min_examined_row_limit对于扫描行数小于该参数的SQL,不会记录到慢查询日志中,默认为0。忽略long_query_time参数,默认为OFFlog_throttle_queries_not_using_indexes设置每分钟日志中记录未使用的索引语句数,在这个数之后,只记录语句数和总耗时,默认为0ANALYZETABLE、CHECKTABLE、CREATEINDEX、DROPINDEX、OPTIMIZETABLE和REPAIRTABLE,默认为OFFlog_slow_slave_statements记录了在从库上执行的慢查询语句。如果binlog值为row,则无效。默认为关闭。有两种方法可以启用慢查询。您可以修改配置文件以设置全局变量。需要修改配置文件my.ini,在[mysqld]段添加如下参数:[mysqld]log_output='FILE,TABLE'slow_query_log='ON'long_query_time=0.001然后需要重启MySQL才能生效,命令为servicemysqldrestart方法2无需重启即可生效,但是重启会导致设置失败,设置命令如下:SETGLOBALslow_query_log='ON';SETGLOBALlog_output='文件,表';SETGLOBALlong_query_time=0.001;这样就可以将慢查询日志同时记录在文件和mysql.slow_log表中。第二种方式是开启慢查询日志,然后使用全表查询语句SELECT*FROMuser然后查询慢查询日志:SELECT*FROMmysql.slow_log,可以找到这样一条记录:slow_log其中,start_time是执行时间,user_host是用户的主机名,query_time是查询花费的时间,lock_time是查询使用锁的时间,rows_sent是这次查询返回给客户端多少数据,rows_examined表示这条语句扫描了多少行,db是数据库,sql_text是这条SQL,thread_id是执行这条查询的线程id。这样我们就可以对slow_log表中的数据进行分析,进而对SQL进行调优。上面是通过Table来分析的,下面是通过文件的慢查询是怎样的。如果不知道文件保存在哪里,可以使用SHOWVARIABLESLIKE'%slow_query_log_file%'查看文件保存位置,打开慢查询日志文件,可以看到每五行代表一条慢SQL,检查起来比较麻烦,可以使用一些工具来检查。慢查询日志文件mysqldumpslowMySQL内置了一个mysqldumpslow工具来帮助我们分析慢查询日志文件。要在Windows环境下使用此工具,您需要安装Perl环境。可以使用-help查看它的命令参数:mysqldumpslowhelp比如我们可以使用mysqldumpslow-st10LAPTOP-8817LKVE-slow.log命令得到10条SQL,按查询时间排序。mysqldumpslow结果pt-query-digest除了pt-query-digest,这是PerconaToolkit中的工具之一,下载地址:https://www.percona.com/downloads/percona-toolkit/LATEST/,如果有是Windows系统,可以在安装Perl的环境下下载脚本:https://raw.githubusercontent.com/percona/percona-toolkit/3.x/bin/pt-query-digest-query-digest给出简单介绍:pt-query-digest是一款第三方MySQL慢查询分析工具,可以分析binlog、generallog和slowlog,也可以通过showprocesslist或者tcpdump抓取的MySQL协议数据进行检索分析,分析结果可以输出到文件中。分析过程是先对查询语句的条件进行参数化,然后对参数化后的查询进行分组统计,计算出每条查询的执行时间、频率、比例等。分析结果可用于识别问题并对其进行优化。有兴趣的可以先下载玩玩。pt-query-digest工具会在后续文章中详细介绍。showprocesslist还有一种情况是慢查询还在执行,慢查询日志找不到慢SQL。这时候可以使用showprocesslist命令来查找慢查询。该命令可以显示正在运行的线程。执行结果如下图,可以根据Time的大小判断是否是慢查询。showprocesslist总结本文主要讲解如何定位慢查询,并简单介绍mysqldumpslow和pt-query-digest工具。后面会讲解explain、showprofile、trace等常用方法。你在定位慢查询或优化SQL时使用什么方法?