已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我是一名技术文档工程师,日常在帮 30 人数据团队搭指标体系(上一篇《指标字典不是文档是断言》讲过指标断言的落地)。现在接手一个新课题:给一个 MySQL 8.0.36 / InnoDB 多租户核心库(单主 32C128G,核心表 2.8 亿行,头部租户占 41%,慢日志日均 1500+ 条)搭一套**「执行计划稳定性」度量体系**。
站内的讨论我基本都读过了:2216 问「怎么监测计划突变」、2258 问「四条固化路线怎么取舍」、1551/1486 问「告警阈值静态还是动态」、208 给了统计信息漂移的根因案例。但这些都默认「计划稳定性」已经被定义成指标了——没人正面回答:这个指标本身怎么算。
我试过三种朴素的「稳定性」定义,全部踩坑:
rows 估算值每次跑都漂,直接 diff 全是噪声。type、key、Extra 里 Using temporary; Using filesort 的出现顺序会随优化器版本变,直接 hash 整个 EXPLAIN JSON 会假阳性爆炸。performance_schema.events_statements_history_long 抓 fingerprint 级执行记录,digest_text 做模板归一化——可行,但 3000+ 模板 × 多租户,存储和聚合查询本身就有压力;information_schema.processlist + 自定义采样脚本,每 5 分钟抓一次活跃 SQL 的 EXPLAIN——抓到的是「当前正在跑的」,对低频模板(一天跑 3 次)覆盖不到;rows 估算值、Extra 顺序这类噪声?具体到哪些字段参与 hash、哪些排除?我接受「目前没有现成指标,但有一套可落地的近似方案」这种回答——比「用 Prometheus 看 P99 就行了」有用。