已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】
我是 DBA,3 年经验,主要做数据库设计与慢查询治理。主库 MySQL 8.0.32(社区版,InnoDB,单主 16C64G,innodb_buffer_pool_size=32G),核心业务表 t_report_src 约 1200 万行、当前已有 4 个二级索引(含 idx_tenant_time (tenant_id, created_at)),写入以 INSERT 为主,日常 QPS 300~500、峰值约 800。
【现象】 库里唯一还慢的是一条低频报表 SQL,业务方报表工具里写死:
SELECT tenant_id, status, amount, created_at
FROM t_report_src
WHERE created_at BETWEEN ? AND ?
ORDER BY created_at DESC
LIMIT 20;
EXPLAIN 确认 type=ALL、key=NULL、rows≈1200万,确实是全表扫,P99 稳定在 3~5s。它的特点是低频:白天集中,全天约 300~500 次,夜间几乎为 0。
【已尝试的排查与结果】
idx_created_status (created_at, status) 之类的索引可覆盖查询,但这是该表的第 5 个二级索引。【我真正卡住的点】 这是一笔成本收益时间尺度不对称的账,我一时没法把两个量纲放同一把尺子比:
我知道「补索引后写 QPS 掉多少」这种事后算账社区已经有人量化过(885 号提问),我想问的是事前决策这笔账:
【期望得到的答案形态】
(引用说明:885 号已量化「补索引后写入放大」的事后账、1500 号讨论过「加索引是隐性成本」,本文聚焦的是事前、且收益低频 vs 成本持续的时间尺度不对称这块还没人给判据的角落。)