如何定位耗时sql_mysql性能分析技巧

发布时间 - 2026-02-03 00:00:00    点击率:
定位耗时SQL需先启用慢查询日志并配置long_query_time,再用mysqldumpslow归类分析,接着通过EXPLAIN诊断执行计划,最后结合PROCESSLIST和锁等待监控长事务与阻塞。

定位耗时 SQL 是 MySQL 性能分析中最直接也最关键的一步。核心思路是:先抓“慢”的,再看“为什么慢”。重点不在查所有 SQL,而在快速聚焦真正拖慢系统的那几条。

开启并配置慢查询日志

这是最基础、最可靠的入口。MySQL 默认不记录慢查询,需手动启用:

  • 在 my.cnf(或 my.ini)中添加:
    slow_query_log = ON
    slow_query_log_file = /var/log/mysql/mysql-slow.log
    long_query_time = 1.0(单位秒,建议初设为 1,高并发场景可调至 0.5)
  • 动态开启(无需重启):
    SET GLOBAL slow_query_log = ON;
    SET GLOBAL long_query_time = 1;
  • 注意:long_query_time 对已建立连接不生效,新连接才生效;若用代理(如 ProxySQL),可能需额外配置其慢日志。

用 mysqldumpslow 快速归类分析

原始慢日志杂乱冗长,直接 grep 效率低。mysqldumpslow 是官方配套工具,能按模板聚合统计:

  • 查看执行次数最多、平均耗时最长的前 10 条:
    mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
  • 查看总耗时最长的前 10 条(关注“拖累大盘”的 SQL):
    mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
  • -g "WHERE.*status" 可过滤含特定关键词的模板,缩小范围。

结合 EXPLAIN 精准诊断执行计划

找到可疑 SQL 后,别急着改逻辑,先看 MySQL 实际怎么执行它:

  • 对 SELECT 语句加 EXPLAIN FORMAT=TREE(8.0+)或 EXPLAIN(通用),重点关注:
    type:是否用了 index/ range/ ref?全表扫描(ALL)要警惕
    key

    possible_keys:是否命中索引?为何没选最优索引?
    rows:预估扫描行数是否远超实际返回行数?
    Extra:出现 Using filesort、Using temporary、Using join buffer 意味着有优化空间
  • 对 UPDATE/DELETE 也适用:
    EXPLAIN UPDATE ... 或先转成等价 SELECT 再 explain。

实时抓取正在运行的长事务和阻塞

有些 SQL 并不慢,但因锁等待或事务过长,导致其他请求排队——这时慢日志可能不记录,需主动监控:

  • 查当前运行超 1 秒的连接:
    SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 1 AND COMMAND != 'Sleep';
  • 查锁等待关系(8.0+):
    SELECT * FROM performance_schema.data_lock_waits;
    或经典方式:
    SHOW ENGINE INNODB STATUS\G,关注 TRANSACTIONS 部分的 lock wait。
  • 配合 sys.schema_long_running_queries 视图(需 sys schema 已安装)可一键查长时间未结束的查询。


# mysql  # 工具  # ssl  # ai  # proxy  # 为什么  # sql  # select  # format  # using  # var  # delete  # 并发  # 关键词  # 可调  # 行数  # 这是  # 设为  # 而在  # 长时间  # 用了  # 再看  # 再用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel定时任务怎么设置_Laravel Crontab调度器配置  iOS发送验证码倒计时应用  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Android使用GridView实现日历的简单功能  如何快速搭建高效简练网站?  android nfc常用标签读取总结  nginx修改上传文件大小限制的方法  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何快速上传自定义模板至建站之星?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  php json中文编码为null的解决办法  iOS UIView常见属性方法小结  文字头像制作网站推荐软件,醒图能自动配文字吗?  JS去除重复并统计数量的实现方法  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  网站制作价目表怎么做,珍爱网婚介费用多少?  Python文件操作最佳实践_稳定性说明【指导】  高防服务器如何保障网站安全无虞?  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何注册花生壳免费域名并搭建个人网站?  如何在香港免费服务器上快速搭建网站?  如何快速生成橙子建站落地页链接?  Laravel怎么为数据库表字段添加索引以优化查询  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何在万网开始建站?分步指南解析  如何快速搭建高效WAP手机网站?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  bootstrap日历插件datetimepicker使用方法  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Laravel如何生成URL和重定向?(路由助手函数)  JavaScript如何实现类型判断_typeof和instanceof有什么区别  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何破解联通资金短缺导致的基站建设难题?  Linux系统命令中screen命令详解  Laravel如何实现文件上传和存储?(本地与S3配置)  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何在建站之星网店版论坛获取技术支持?  香港服务器部署网站为何提示未备案?  PHP正则匹配日期和时间(时间戳转换)的实例代码  简单实现Android验证码