MySQL怎么快速定位慢SQL

开启慢查询日志

在项目中我们会经常遇到慢查询,当我们遇到慢查询的时候一般都要开启慢查询日志,并且分析慢查询日志,找到慢sql,然后用explain来分析

系统变量

MySQL和慢查询相关的系统变量如下

参数 含义

slow_query_log是否启用慢查询日志, ON为启用,OFF为没有启用,默认为OFFlog_output日志输出位置,默认为FILE,即保存为文件,若设置为TABLE,则将日志记录到mysql.show_log表中,支持设置多种格式slow_query_log_file指定慢查询日志文件的路径和名字long_query_time执行时间超过该值才记录到慢查询日志,单位为秒,默认为10

执行如下语句看是否启用慢查询日志,ON为启用,OFF为没有启用

show variables like "%slow_query_log%"

MySQL怎么快速定位慢SQL

可以看到我的没有启用,可以通过如下两种方式开启慢查询

修改配置文件

修改配置文件my.ini,在[mysqld]段落中加入如下参数

[mysqld]log_output='FILE,TABLE'slow_query_log='ON'long_query_time=0.001

需要重启 MySQL 才可以生效,命令为 service mysqld restart

设置全局变量

我在命令行中执行如下2句打开慢查询日志,设置超时时间为0.001s,并且将日志记录到文件以及mysql.slow_log表中

set global slow_query_log = on;set global log_output = 'FILE,TABLE';set global long_query_time = 0.001;

想要永久生效得到配置文件中配置,否则数据库重启后,这些配置失效

分析慢查询日志

因为mysql慢查询日志相当于是一个流水账,并没有汇总统计的功能,所以我们需要用一些工具来分析一下

mysqldumpslow

mysql内置了mysqldumpslow这个工具来帮我们分析慢查询日志。

MySQL怎么快速定位慢SQL

常见用法

# 取出使用最多的10条慢查询mysqldumpslow -s c -t 10 /var/run/mysqld/mysqld-slow.log# 取出查询时间最慢的3条慢查询mysqldumpslow -s t -t 3 /var/run/mysqld/mysqld-slow.log # 得到按照时间排序的前10条里面含有左连接的查询语句mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log

pt-query-digest

pt-query-digest是我用的最多的一个工具,功能非常强大,可以分析binlog、General log、slowlog,也可以通过show processlist或者通过tcpdump抓取的MySQL协议数据来进行分析。只需下载并授权,即可运行 pt-query-digest 这个 Perl 脚本

下载和赋权

wget www.percona.com/get/pt-query-digestchmod u+x pt-query-digestln -s /opt/soft/pt-query-digest /usr/bin/pt-query-digest

用法介绍

// 查看具体使用方法 pt-query-digest --help// 使用格式pt-query-digest [OPTIONS] [FILES] [DSN]

常用OPTIONS

–create-review-table  当使用–review参数把分析结果输出到表中时,如果没有表就自动创建。

–create-history-table  当使用–history参数把分析结果输出到表中时,如果没有表就自动创建。

–filter  对输入的慢查询按指定的字符串进行匹配过滤后再进行分析

–limit限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是50%则按总响应时间占比从大到小排序,输出到总和达到50%位置截止。

–host  mysql服务器地址

–user  mysql用户名

–password  mysql用户密码

–history 将分析结果保存到表中,分析结果比较详细,下次再使用–history时,如果存在相同的语句,且查询所在的时间区间和历史表中的不同,则会记录到数据表中,可以通过查询同一CHECKSUM来比较某类型查询的历史变化。

–review 将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。如果出现相同的语句分析,下一次使用–review时,不会被记录到数据表中。

–output 分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。

–since 从什么时间开始分析,值为字符串,可以是指定的某个”yyyy-mm-dd [hh:mm:ss]”格式的时间点,也可以是简单的一个时间值:s(秒)、h(小时)、m(分钟)、d(天),如12h就表示从12小时前开始统计。

–until 截止时间,配合—since可以分析一段时间内的慢查询。

常用DSN

A    指定字符集
D    指定连接的数据库
P    连接数据库端口
S    连接Socket file
h    连接数据库主机名
p    连接数据库的密码
t    使用–review或–history时把数据存储到哪张表里
u    连接数据库用户名

DSN使用key=value的形式配置;多个DSN使用,分隔

使用示例

# 展示slow.log中最慢的查询的报表pt-query-digest slow.log# 分析最近12小时内的查询pt-query-digest --since=12h slow.log# 分析指定范围内的查询pt-query-digest slow.log --since '2020-06-20 00:00:00' --until '2020-06-25 00:00:00'# 把slow.log中查询保存到query_history表pt-query-digest --user=root --password=root123 --review h=localhost,D=test,t=query_history --create-review-table slow.log# 连上localhost,并读取processlist,输出到slowlogpt-query-digest --processlist h=localhost --user=root --password=root123 --interval=0.01 --output slowlog# 利用tcpdump获取MySQL协议数据,然后产生最慢查询的报表# tcpdump使用说明:https://blog.csdn.net/chinaltx/article/details/87469933tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txtpt-query-digest --type tcpdump mysql.tcp.txt# 分析binlogmysqlbinlog mysql-bin.000093 > mysql-bin000093.sqlpt-query-digest  --type=binlog mysql-bin000093.sql# 分析general logpt-query-digest  --type=genlog  localhost.log

用法实战

编写存储过程批量造数据

在实际工作中没有测试性能,我们经常需要改造大批量的数据,手动插入是不太可能的,这时候就得用到存储过程了

CREATE TABLE `kf_user_info` (  `id` int(11) NOT NULL COMMENT '用户id',  `gid` int(11) NOT NULL COMMENT '客服组id',  `name` varchar(25) NOT NULL COMMENT '客服名字') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='客户信息表';

如何定义一个存储过程呢?

CREATE PROCEDURE 存储过程名称 ([参数列表])BEGIN    需要执行的语句END

举个例子,插入id为1-100000的100000条数据

用Navicat执行

-- 删除之前定义的DROP PROCEDURE IF EXISTS create_kf;-- 开始定义CREATE PROCEDURE create_kf(IN loop_times INT) BEGINDECLARE var INT;SET var = 1;WHILE var < loop_times DO    INSERT INTO kf_user_info (`id`,`gid`,`name`) VALUES (var, 1000, var);SET var = var + 1;END WHILE; END;-- 调用call create_kf(100000);

存储过程的三种参数类型

参数类型 是否返回 作用

IN否向存储过程传入参数,存储过程中修改该参数的值,不能被返回OUT是把存储过程计算的结果放到该参数中,调用者可以得到返回值INOUT是IN和OUT的结合,即用于存储过程的传入参数,同时又可以把计算结构放到参数中,调用者可以得到返回值

用MySQL执行

得用DELIMITER 定义新的结束符,因为默认情况下SQL采用(;)作为结束符,这样当存储过程中的每一句SQL结束之后,采用(;)作为结束符,就相当于告诉MySQL可以执行这一句了。但是存储过程是一个整体,我们不希望SQL逐条执行,而是采用存储过程整段执行的方式,因此我们就需要定义新的DELIMITER ,新的结束符可以用(//)或者($$)

因为上面的代码应该就改为如下这种方式

DELIMITER //CREATE PROCEDURE create_kf_kfGroup(IN loop_times INT)  BEGIN  DECLARE var INT;SET var = 1;WHILE var <= loop_times DO    INSERT INTO kf_user_info (`id`,`gid`,`name`) VALUES (var, 1000, var);SET var = var + 1;END WHILE;  END //DELIMITER ;

查询已经定义的存储过程

show procedure status;

开始执行慢sql

select * from kf_user_info where id = 9999;select * from kf_user_info where id = 99999;update kf_user_info set gid = 2000 where id = 8888;update kf_user_info set gid = 2000 where id = 88888;

可以执行如下sql查看慢sql的相关信息。

SELECT * FROM mysql.slow_log order by start_time desc;

查看一下慢日志存储位置

show variables like "slow_query_log_file"
pt-query-digest /var/lib/mysql/VM-0-14-centos-slow.log

执行后的文件如下

MySQL怎么快速定位慢SQL

# Profile# Rank Query ID                            Response time Calls R/Call V/M # ==== =================================== ============= ===== ====== ====#    1 0xE2566F6154AFF41948FE497E53631B43   0.1480 56.1%     4 0.0370  0.00 UPDATE kf_user_info#    2 0x2DFBC6DBF0D68EF2EC2AE954DC37A1A4   0.1109 42.1%     4 0.0277  0.00 SELECT kf_user_info# MISC 0xMISC                               0.0047  1.8%     2 0.0024   0.0 

从最上面的统计sql中就可以看到执行慢的sql

可以看到响应时间,执行次数,每次执行耗时(单位秒),执行的sql

下面就是各个慢sql的详细分析,比如,执行时间,获取锁的时间,执行时间分布,所在的表等信息

不由得感叹一声,真是神器,查看慢sql超级方便

最后说一个我遇到的一个有意思的问题,有一段时间线上的接口特别慢,但是我查日志发现sql执行的很快,难道是网络的问题?

为了确定是否是网络的问题,我就用拦截器看了一下接口的执行时间,发现耗时很长,考虑到方法加了事务,难道是事务提交很慢?

于是我用pt-query-digest统计了一下1分钟左右的慢日志,发现事务提交的次很多,但是每次提交事务的平均时长是1.4s左右,果然是事务提交很慢。

MySQL怎么快速定位慢SQL

以上就是MySQL怎么快速定位慢SQL的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/147170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Composer中的–no-dev参数在部署时有多重要
上一篇 2025年12月2日 14:24:58
Laravel控制器作用?控制器怎样创建调用?
下一篇 2025年12月2日 14:26:10

相关推荐

  • 告别DynamoDB查询的繁琐:使用Terseq库简化AWS数据库操作

    最近,我负责一个项目需要频繁地与aws dynamodb进行交互。起初,我直接使用aws sdk for php进行操作。然而,随着项目复杂度的增加,我发现编写和维护dynamodb查询代码变得越来越困难。大量的样板代码不仅降低了开发效率,而且容易出错,维护起来也十分费力。例如,一个简单的更新操作就…

    用户投稿 2026年9月4日
    000
  • Spring Boot连接MySQL数据库首次失败,后续却正常的原因是什么?

    Spring Boot连接MySQL数据库:首次连接失败,后续正常的原因及解决方法 在使用Spring Boot连接MySQL数据库时,常常遇到首次连接失败,后续连接却正常的情况。 这通常是因为MySQL服务器、JDBC驱动和数据库连接参数之间的兼容性问题导致的。 常见的错误信息是:“the las…

    2026年9月4日
    000
  • 深入解析MySQL中的LIMIT语句

    深入解析MySQL中的LIMIT语句深入解析MySQL中的LIMIT语句深入解析MySQL中的LIMIT语句深入解析MySQL中的LIMIT语句

    本篇文章带大家了解一下mysql中的limit语句,聊聊一个问题–mysql的limit这么差劲的吗?希望对大家有所帮助! 最近有多个小伙伴在答疑群里问了小孩子关于LIMIT的一个问题,下边我来大致描述一下这个问题。 问题 为了故事的顺利发展,我们得先有个表: CREATE TABLE …

    2026年9月4日 用户投稿
    000
  • 冲击DeepSeek R1,谷歌发布新一代Gemini全型号刷榜,编程、物理模拟能力炸裂

    冲击DeepSeek R1,谷歌发布新一代Gemini全型号刷榜,编程、物理模拟能力炸裂冲击DeepSeek R1,谷歌发布新一代Gemini全型号刷榜,编程、物理模拟能力炸裂冲击DeepSeek R1,谷歌发布新一代Gemini全型号刷榜,编程、物理模拟能力炸裂冲击DeepSeek R1,谷歌发布新一代Gemini全型号刷榜,编程、物理模拟能力炸裂

    谷歌gemini 2.0系列强势来袭,挑战大模型格局!面对deepseek的强劲竞争,谷歌迅速推出gemini 2.0 flash、gemini 2.0 flash-lite以及旗舰级gemini 2.0 pro实验版,并在gemini app中集成推理模型gemini 2.0 flash thin…

    2026年9月4日 用户投稿
    300
  • 守愿者托塔天王李靖全技能解析与实战指南

    守愿者托塔天王李靖全技能解析与实战指南守愿者托塔天王李靖全技能解析与实战指南守愿者托塔天王李靖全技能解析与实战指南守愿者托塔天王李靖全技能解析与实战指南

    踏入《守愿者》,开启一段别具一格的西行征途!本作巧妙融合传统西游文化与创新放置卡牌机制,为玩家呈现一场策略与情怀兼具的精彩对决。今日主角,正是三界威名赫赫的战将——托塔天王李靖,让我们一同揭开这位塔影擎天者的真正实力,助你阵容更上一层楼! 神威凛然:托塔天王·李靖 玄甲映辉,银须飘逸。 手中七宝玲珑…

    2026年9月4日 用户投稿
    000
  • 高效日志缓冲:使用 Travail/Log-Buffered 提升应用性能

    在构建一个高吞吐量的实时数据处理系统时,我面临着一个棘手的问题:大量的日志记录严重影响了系统的整体性能。传统的日志记录方式,每次操作都直接写入日志文件,导致i/o操作频繁,成为系统的瓶颈。这不仅降低了处理速度,还增加了服务器负载。为了解决这个问题,我开始寻找更高效的日志记录方案。 经过一番调研,我找…

    用户投稿 2026年9月4日
    000
  • Potplayer怎么保存播放设置_Potplayer保存配置的详细操作步骤

    首先保存设置为默认:右键→选项→基本→保存当前设置为默认值;其次可导出配置文件:F5→保存/载入配置方案→保存为.dplcfg文件;需要时通过载入按钮导入配置;最后启用播放记忆功能:播放分类中勾选记住每个文件的播放位置,实现自动续播。 如果您在使用PotPlayer时调整了播放参数,但希望下次打开时…

    2026年9月4日
    100
  • Surgent Studios公布新作——第一人称恐怖游戏《遗映》开启一场娱乐行业的心理恐怖之旅

    独立游戏团队 surgent team 今日联合发行商 pocketpair publishing,正式推出了其全新力作——第一人称心理恐怖游戏《遗映》(dead take)。游戏预计将在今年内正式发售,目前 steam 商店页面已经上线。 在《遗映》中,玩家将进入一个关于权力与腐败交织的惊悚世界。…

    2026年9月4日
    000
  • 深入解析MySQL中SQL的执行流程(图文结合)

    深入解析MySQL中SQL的执行流程(图文结合)深入解析MySQL中SQL的执行流程(图文结合)深入解析MySQL中SQL的执行流程(图文结合)深入解析MySQL中SQL的执行流程(图文结合)

    本篇文章带大家了解mysql中sql的执行流程,看看mysql 是如何执行一条查询语句的?希望对大家有所帮助! 对于一个开发工程师来说,了解一下 MySQL 是如何执行一条查询语句的,我想是非常有必要的。【相关推荐:mysql视频教程】 首先我们要了解一下MYSQL的体系架构是什么样子的?然后再来聊…

    2026年9月4日 用户投稿
    000
  • 电脑自动关机故障排查,电源问题及散热故障分析

    电脑自动关机故障排查,电源问题及散热故障分析电脑自动关机故障排查,电源问题及散热故障分析电脑自动关机故障排查,电源问题及散热故障分析电脑自动关机故障排查,电源问题及散热故障分析

    电脑自动关机主因是电源供电不足或散热不良。1.判断电源问题:观察是否在高负载时关机、检查电源线连接是否牢固、确认电源瓦数是否足够、用软件监控电压稳定性、注意是否有异味或异响、替换测试确认问题。2.排查散热故障:听风扇声音并检查出风情况、彻底清理灰尘、检查风扇转速、更换导热硅脂、优化机箱风道、用软件监…

    2026年9月4日 用户投稿
    200
  • 基于PHP实现登录用户专属文件下载访问控制

    本教程旨在解决用户登录后才能下载特定文件,而未登录用户即使知晓文件路径也无法访问的问题。通过介绍一种基于PHP脚本的解决方案,替代传统.htaccess的限制,实现对文件下载的精细化权限控制,确保只有经过身份验证的用户才能获取指定资源。 引言:登录用户文件下载的挑战 在web应用中,我们经常需要提供…

    2026年9月4日
    000
  • 扩展 Laravel Eloquent 的能力:fattureincloud/eloquence-hookable 的实践

    最近在开发一个 laravel 项目时,需要在用户模型保存之前对某些属性进行特殊处理。例如,在保存用户邮箱之前,需要检查邮箱是否已经存在,以及进行格式验证。虽然可以通过在模型中直接编写逻辑来实现,但这会使模型代码变得臃肿,难以维护。这时,我发现了 fattureincloud/eloquence-h…

    用户投稿 2026年9月4日
    000
  • 途虎养车空调滤芯怎么换_途虎养车空调滤芯更换图解

    汽车空调出风量变小、有异味或制冷差可能是空调滤芯堵塞所致,可通过途虎养车更换:一、拆卸手套箱,先清空并挤压内壁脱离卡扣,拔出右侧卡扣后缓慢放下;二、打开滤芯盖板,滑动取下盖板后水平抽出旧滤芯,检查脏污情况;三、安装新滤芯需注意气流方向标识,箭头指向车辆前方或向上,确保完全插入;四、复位时先装回盖板并…

    2026年9月4日
    100
  • 分析MySQL用户中的百分号%是否包含localhost?

    MySQL用户中的%到底包不包括localhost? 1 前言 操作mysql的时候发现,有时只建了%的账号,可以通过localhost连接,有时候却不可以,网上搜索也找不到满意的答案,干脆手动测试一波 推荐学习:《mysql视频教程》 2 两种连接方法 这里说的两种连接方法指是执行mysql命令时…

    用户投稿 2026年9月4日
    000
  • 告别支付集成难题:MONEI PHP SDK 助力高效支付

    在最近的项目中,我们需要集成一个安全的、高效的支付网关。起初,我们计划自己开发支付流程,这听起来似乎可行,但很快我们发现自己陷入了困境。首先,确保支付流程的安全性是一项艰巨的任务,需要处理各种潜在的安全漏洞。其次,我们需要支持多种支付方式,这需要大量的代码编写和测试工作,以确保与各种支付提供商的兼容…

    用户投稿 2026年9月4日
    000
  • 在Mac下进行MySQL环境搭建的两种方法

    Mac 下 MySQL 环境搭建 mac 下安装 mysql 还是很方便的, 总结来看有2个方法。 方法一:用dmg镜像安装 1、安装 官网下载好 MySQL Mac 版安装包,常规步骤安装,安装过程中会出现如下提示: 2019-03-24T18:27:31.043133Z 1 [Note] A t…

    用户投稿 2026年9月4日
    000
  • C++中如何用Lambda函数实现私有函数仅供公有函数调用?

    C++中使用Lambda函数模拟私有函数,仅供公有函数调用 问题:如何在C++中实现类似于其他语言中“私有函数仅供公有函数调用”的特性? 解决方法:虽然C++没有直接的“私有函数”概念像Java或C#那样,但我们可以巧妙地利用Lambda表达式来模拟这种行为。Lambda表达式创建的匿名函数,其作用…

    2026年9月4日
    000
  • 美信科技:湾区总部工业园预计今年上半年投入使用

    美信科技湾区总部工业园预计上半年投入使用,积极应对市场挑战。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 美信科技近日在投资者互动平台透露,其位于湾区总部的工业园区目前正在装修,计划于今年上半年正式投入运营。 面对严峻的市场竞争,公司持续…

    2026年9月4日
    000
  • 教你在Mac下如何快速重置mysql root密码

    Mac下重置mysql的root密码 我的mysql版本 MYSQL V5.7.9,旧版本请使用: UPDATE mysql.user SET Password=PASSWORD(‘新密码’) WHERE User=’root’; Mac OS X – 重置 MySQL Root密码 密…

    2026年9月4日
    100
  • 豆包电脑版上线AI播客功能,支持一键生成播客

    据悉,6月17日,豆包电脑版已全面上线ai播客功能。用户只需上传pdf文件或网页链接,即可一键生成双人对话形式的播客节目,语音效果高度拟人化,对话自然流畅。 参与内测的用户反馈称,他们会将一些较长的学习资料发送给豆包,通过一键转换为语音内容,实现随时随地“轻松听长文”。生成的AI播客在音色上与真人非…

    2026年9月4日
    000

发表回复

登录后才能评论
关注微信