MySQL performance_schema 语句 digest 如何定位慢 SQL 模式
如果业务只说“数据库最近变慢”,先别急着给某一条 SQL 加索引。MySQL 的 Performance Schema 可以把形态相同、参数不同的语句聚成 digest,再用总耗时、平均耗时、执行次数和扫描行数区分“最费资源”和“单次最慢”。真正值得先处理的,通常是排名靠前且能拿到样本 SQL 的模式。
官方文档入口:https://dev.mysql.com/doc/refman/8.4/en/
SCHEMA_NAME + DIGEST是主要聚合边界,DIGEST_TEXT是规范化后的语句模式。SUM_TIMER_WAIT找工作量贡献,AVG_TIMER_WAIT看单次延迟,不能只盯一个排序。DIGEST IS NULL、容量上限和采样文本都要复核,否则排名可能失真。
先把 digest 视为“语句模式”,再选统计口径
digest 不是原始 SQL 日志,而是 Performance Schema 对已结束语句做的汇总。相同 schema 下,字面量不同但结构相近的查询会落到同一个语句模式;因此它适合回答“应用反复执行哪类 SQL”,不适合直接回答“某一次请求究竟传了什么值”。

COUNT_STAR 表示执行次数,SUM_TIMER_WAIT 表示累计等待,AVG_TIMER_WAIT 表示平均等待,MAX_TIMER_WAIT 则提醒你是否存在长尾。按总耗时排序适合先找“整体最贵”的模式;按平均耗时排序才更接近“单次请求很慢”的问题。
用一条查询先找出最值得处理的慢 SQL 模式
下面的查询把 Performance Schema 的计时字段换算为毫秒,并把扫描量、临时表和样本 SQL 一并取出。示例只读汇总表,不会在本机运行,也不应把示例结果误当成你的线上数据。
SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR, ROUND(SUM_TIMER_WAIT / 1000000000000, 2) AS total_ms, ROUND(AVG_TIMER_WAIT / 1000000000000, 2) AS avg_ms, ROUND(MAX_TIMER_WAIT / 1000000000000, 2) AS max_ms, SUM_ROWS_EXAMINED, SUM_ROWS_SENT, SUM_CREATED_TMP_DISK_TABLES, QUERY_SAMPLE_TEXT, FIRST_SEEN, LAST_SEEN FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST IS NOT NULL -- 先按累计耗时找工作量贡献最大的语句模式 ORDER BY SUM_TIMER_WAIT DESC LIMIT 20;
这里的排序口径很关键:高频但每次只慢一点的 SQL,可能总耗时最高;低频但单次很慢的 SQL,则可能在 avg_ms 或 max_ms 排名靠前。SUM_ROWS_EXAMINED 与 SUM_ROWS_SENT 的差距很大时,通常值得再看过滤条件、索引选择和回表成本。
从排名到定位:用样本 SQL 和边界字段复核
拿到候选 digest 后,先看 DIGEST_TEXT 了解模式,再看 QUERY_SAMPLE_TEXT 取得一个实际见过的样本。样本只用于帮助你做 EXPLAIN 或回到应用调用链复核,不能代表该 digest 的所有参数分布。

可以把候选分成三类:总耗时高,优先处理整体资源贡献;平均耗时和最大耗时高,优先检查长尾与锁等待;扫描量高但返回行少,优先核对索引和过滤条件。若要观察某个 digest 的更细粒度仪表,MySQL 的 sys schema 还提供 ps_trace_statement_digest(),但它仍然受 Performance Schema 已采集数据和权限影响。
别让 digest 容量和采样误导判断
digest 汇总表有容量上限。新模式无法进入正常行时,可能汇总到 SCHEMA_NAME、DIGEST 都为 NULL 的 catch-all 行;还应留意 Performance_schema_digest_lost。如果这类行占比明显,先调整启动时的 performance_schema_digests_size,再谈排名。
做一次可比较的观察时,可以在明确的低峰窗口清空 digest 汇总,再让固定业务流量运行一段时间:
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest; -- 清空当前 digest 窗口;生产环境先确认权限、采样时段和回滚安排 SHOW GLOBAL STATUS LIKE 'Performance_schema_digest_lost';
清空后不要立刻把空表当成“没有慢 SQL”,要等目标流量重新产生统计。最终优化动作仍需结合 EXPLAIN、锁等待、索引使用和应用侧延迟验证;digest 负责缩小范围,不替你做完整执行计划分析。
相关问题
为什么总耗时最高的 SQL 不一定单次最慢?
因为总耗时约等于执行次数与平均耗时的共同结果。高频查询即使单次不慢,也可能贡献最多累计等待。
DIGEST_TEXT 和 QUERY_SAMPLE_TEXT 有什么区别?
DIGEST_TEXT 用来描述归一化后的模式,QUERY_SAMPLE_TEXT 是该模式实际见过的一个样本,后者更适合拿去做代表性检查。
看到 DIGEST 为 NULL 要不要直接优化?
不要。先检查 digest 表容量和丢失计数;NULL 行混合了未能单独建行的模式,不能作为一条具体 SQL 的优化对象。
Go draw.Draw 使用遮罩后边缘颜色为什么变淡
- 上一篇
- Go draw.Draw 使用遮罩后边缘颜色为什么变淡
- 下一篇
- Go httptest.Server.Client 返回的客户端如何加入自定义超时
-
- 数据库 · MySQL | 2小时前 |
- MySQL REGEXP_SUBSTR 如何提取正则捕获组内容
- 199浏览 收藏
-
- 数据库 · MySQL | 3小时前 | MySQL · 数据类型 · JSON · SQL排错 · MEMBER OF · MySQL MEMBER OF MySQL JSON 数组成员判断 MEMBER OF 类型不匹配 JSON 数字字符串区别 MySQL JSON 查询
- MySQL MEMBER OF 判断 JSON 数组成员时为什么类型不匹配
- 167浏览 收藏
-
- 数据库 · MySQL | 5小时前 | MySQL · 数据库查询 · JSON 函数 · SQL 边界 · JSON 数组 · JSON_CONTAINS MySQL JSON_OVERLAPS JSON 数组相交 MySQL JSON 类型比较 MySQL NULL 边界
- MySQL JSON_OVERLAPS 判断两个数组相交时有哪些边界
- 130浏览 收藏
-
- 数据库 · MySQL | 6小时前 |
- MySQL JSON_VALUE 返回数字类型时如何避免字符串比较
- 418浏览 收藏
-
- 数据库 · MySQL | 7小时前 |
- MySQL 默认表达式引用其他列为什么无法创建表
- 410浏览 收藏
-
- 数据库 · MySQL | 9小时前 | MySQL · 数据校验 · 数据库约束 · 约束 MySQL CHECK
- MySQL CHECK 约束写入非法值时为什么没有报错
- 452浏览 收藏
-
- 数据库 · MySQL | 10小时前 |
- MySQL EXISTS 和 IN 遇到 NULL 条件时有什么区别
- 425浏览 收藏
-
- 数据库 · MySQL | 11小时前 |
- MySQL GROUP_CONCAT 如何按排序规则拼接稳定结果
- 488浏览 收藏
-
- 数据库 · MySQL | 13小时前 | SQL查询 · group by · MySQL教程 · mysql group by ONLY_FULL_GROUP_BY 函数依赖 ERROR 1055
- MySQL ONLY_FULL_GROUP_BY 遇到函数依赖时如何改写查询
- 440浏览 收藏
-
- 数据库 · MySQL | 1天前 | MySQL · DDL · InnoDB · mysql innodb ALGORITHM=INSTANT Instant DDL
- Instant DDL 表结构限制怎么配置或排查
- 486浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 26次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 130次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 60次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 22次使用
-
- OpenCompass
- OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
- 81次使用
-
- MySQL 明明加了索引,为什么查询还是很慢?先查这 6 个点
- 2026-06-27 374浏览
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- 详解如何利用GORM实现MySQL事务
- 2023-01-07 184浏览
-
- Go语言实现操作MySQL的基础知识总结
- 2023-01-23 265浏览

