Postgres 复合索引:为什么你的索引没被用上
同一个复合索引,在两条看起来相似的查询里表现完全不同。把 EXPLAIN 读完之后我发现,问题出在列序和过滤条件的选择性上。
本文目录
复合索引的列序决定了它能服务哪类查询:等值条件在前,范围条件在后。反过来写,等值条件之后的列基本用不上。
sql
CREATE INDEX idx_orders_user_status_created
ON orders (user_id, status, created_at DESC);- 查询里只用到 status 时,这个索引通常不会被选,因为前导列缺失
- 把 status 放第一位会让 user_id 的过滤能力下降
- 真正的高频查询应该单独建索引,而不是让一个索引服务所有场景
最后我把两个高频查询分别建了索引,删掉了那个谁都用不上的中间产物。写入压力略降,慢查询也消失了。