已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 MySQL 8.0.32 / InnoDB,单主 32C128G,innodb_buffer_pool_size=96G。核心表 t_settlement 约 1.2 亿行,当前含 PK + 4 个二级索引(idx_merchant_time、idx_batch_no、idx_status_merchant、idx_created_at)。日常写入 INSERT 为主约 800 TPS,少量 UPDATE status。
当前要治理的慢 SQL:
SELECT id, amount, status FROM t_settlement
WHERE merchant_id = ? AND status IN ('PENDING','PROCESSING')
ORDER BY created_at DESC LIMIT 50;
EXPLAIN 显示 type=ALL、rows≈1.2亿,P99 稳定在 1.4s(日常 200 QPS 的点查)。我准备加联合索引 idx_merchant_status_created (merchant_id, status, created_at DESC),预期把这条 P99 压到 5ms 以内。
【现象 / 我担心的点】
这条表上还有另外 6 条高频查询(日均合计 3000+ QPS),其中 2 条 WHERE 条件只带 merchant_id(不带 status),1 条是 WHERE status = 'PENDING' AND created_at > ?(不带 merchant_id)。我担心加了新索引后,优化器可能:
【已尝试的排查与结果】
【期望得到的答案形态】
我倾向于不要"加完观察一周再说"这种兜底方案,1.2 亿行 + 800 TPS 写入,一旦新索引导致某条高频 SQL 从 idx 切到全表扫,影响面是秒级的。想听听大家更体系化的做法。