线上收到一条告警:某张订单明细表按 user_id 查询时 P99 从 8ms 涨到 1.2s,EXPLAIN 显示全表扫描。翻了下,user_id 上确实没有索引,而这张表已经两千万行。下面是我在复盘中整理出的几个可复用片段,覆盖从索引探测到灰度上线。
排查阶段别急着加索引。先看 EXPLAIN ANALYZE 的 rows 估算与实际差多少,再看 pg_stat_user_tables 里 seq_scan 和 idx_scan 的比例。若某表 seq_scan 持续上涨且 idx_scan 为 0,基本可以锁定缺索引。查询接口通常长这样:
<?php