已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
背景
我负责一套 MySQL 8.0.32 / InnoDB 的订单核心库,单主 64C256G,innodb_buffer_pool_size=64GB,innodb_lru_scan_depth=256(默认值)。核心表 t_order 约 2 亿行、数据文件约 90GB,日常在线点查(按 merchant_id + status 二级索引)QPS 约 3000,热工作集(高频访问的页)估算约 12GB,P99 基线稳定在 15ms 左右。
每天下午 14:00 有一个 BI 聚合任务(非事务、只读)直接扫 t_order 全表做 GROUP BY,扫描量约 40GB 冷数据,扫描速率实测约 1.2GB/s,耗时约 33 秒。
现象
Innodb_buffer_pool_read_requests / Innodb_buffer_pool_reads 算出的命中率始终 > 98%,监控上"看起来没坏";SHOW ENGINE INNODB STATUS 的 History list length 无异常,排除了 undo 积累。已尝试的排查
innodb_lru_scan_depth 从 256 改到 1024:P99 峰值略有下降(400ms → 350ms),但恢复窗口时长基本没变;FLUSH TABLES + 等 5 分钟:无效,buffer pool 页不会被 flush;期望得到的答案形态
buffer_pool_size、热工作集大小、扫描量、扫描速率,如何预估"污染窗口"时长(即 P99 从峰值回落到基线的时间)?参数之间是什么关系,哪个是主导因素?performance_schema 或 information_schema 指标能用来判断"热工作集已重建完毕"?(比如 Innodb_buffer_pool_pages_data 的变化趋势、某条热查询的 rows_examined 是否恢复正常?)有没有一个"恢复完成"的可观测判据?