当前位置: 首页 > 后端技术 > PHP

你的哪个SQL慢?看看MySQL慢查询日志

时间:2023-03-29 16:54:34 PHP

前言在项目中,或多或少都存在执行缓慢的隐藏SQL。不同的开发人员和测试人员在正常使用过程中或多或少可能会遇到,但不能立即排查解决。所以如果有一个文件可以记录下使用过程中的慢SQL,并定期分析,那就太好了。在这种情况下,MySQL也为我们想到了。它提供了SQL慢查询的日志。本文将分享如何使用它。什么是慢查询日志?MySQL的慢查询日志提供了记录MySQL中响应时间超过指定阈值的语句的功能。例如,如果阈值设置为3秒,则任何超过3秒的SQL执行都会被记录下来。借助慢查询日志功能,我们可以发现那些执行时间较长的查询,并有针对性地对其进行优化,从而提高系统的整体效率。如何启用慢查询日志?默认情况下,MySQL数据库是不开启慢查询日志的,因为它会对性能产生一定的影响。我们可以在开发测试环境或者生产环境调优的时候开启,那么如何查看是否开启呢?检查慢SQL是否启用执行以下命令检查慢SQL是否启用showvariableslike'%slow_query_log';复制代码OFF:未启用ON:启用如何启用慢查询执行以下命令启用慢查询日志setglobalslow_query_log='ON';复制代码修改慢查询阈值前面提到,SQL执行达到指定时间阈值后会记录在慢查询日志中,那么如何设置呢?设置全局long_query_time=N;setlong_query_time=N复制代码设置全局的方式对当前session的long_query_time无效。对新连接的客户端有效。所以可以同时执行下面的语句。N代表设置的阈值,单位是秒。在这里,显示全局变量,如“%long_query_time%”;您可以检查如何将阈值设置为永久生效。之前的设置是通过命令行。如果MySQL重新启动,那么配置将被重置。我们可以通过修改mysql配置my.cfg或者my.ini来永久生效。[mysqld]slow_query_log=ON#打开慢查询日志开关slow_query_log_file=/var/lib/mysql/alvin-slow.log#慢查询日志的目录和文件名信息long_query_time=3#设置慢查询阈值为3seconds,超过这个设置值的SQL记录在慢查询日志中log_output=FILE慢查询日志在哪里?我解释了如何启用MySQL的慢查询日志,那么它记录日志在哪里呢?通过showvariableslike'%slow_query_log_file%'查看慢查询日志的位置;命令查看慢SQL文件所在位置,如下图:修改慢查询日志所在位置也很简单,执行如下命令即可:setglobalslow_query_log_file='/usr/local/mysql/data/alvin-slow-slow.log';如何复制代码查看慢SQL内容?既然我们知道了慢查询日志在哪里,那么我们如何查看它的内容呢?让我们在这里用一个例子来证明它。一条查询的SQL执行耗时超过1秒,超过了之前设定的阈值1s。检查慢查询的数量。执行以下命令查询当前系统中有多少条慢查询记录。SHOWGLOBALSTATUSLIKE'%Slow_queries%';Copycodevalue=1,说明刚才的日志已经记录了。查看日志内容通过cat命令查看文件内容,可以看到对应的慢SQL。慢查询日志分析工具mysqldumpslow如果需要手动分析日志,查找和分析SQL,显然是一项费力的工作。MySQL提供了一个日志分析工具mysqldumpslow。mysqldumpslow命令的具体参数如下:-a:数字不抽象成N,字符串抽象成S-s:表示排序方式:c:访问次数l:锁定时间r:返回记录t:查询时间al:平均锁定时间ar:平均返回记录数-g:后跟正则匹配模式,不区分大小写;mysqldumpslow可以位于mysql的bin目录下,执行mysqldumpslow--help命令即可查看和使用。例子:我们想按查询时间排序,查看前5条SQL语句,这样写就可以了:mysqldumpslow-st-t5/usr/local/mysql/data/alvin-slow-slow.log复制代码常用用法:get返回前10条记录集SQLmysqldumpslow-sr-t10/usr/local/mysql/data/alvin-slow-slow.log获取前10条访问次数SQLmysqldumpslow-sc-t10/usr/local/mysql/data/alvin-slow-slow.log获取前10个包含按时间排序的左连接的查询语句mysqldumpslow-st-t10-g"leftjoin"/usr/local/mysql/data/alvin-slow-slow。此外,建议将这些命令与|结合使用。多,否则可能会爆屏mysqldumpslow-sr-t10/usr/local/mysql/data/alvin-slow-slow.log|更多SQL日志?现在有很多慢查询日志。为了不互相混淆,我想删除一些慢的SQL日志。如何删除它们?可以手动删除慢查询日志文件,即rm命令。使用命令mysqladminflush-logs重置慢速SQL日志的内容。完整命令如下:mysqladmin-uroot-pflush-logsslow复制代码摘要本文介绍如何打开和使用慢速SQL日志,这是一种非常重要且有效的故障排除手段。排查完记得关闭慢SQL日志,否则可能会影响性能。