数据库2026.07.3010 MIN READ

Postgres 复合索引:为什么你的索引没被用上

同一个复合索引,在两条看起来相似的查询里表现完全不同。把 EXPLAIN 读完之后我发现,问题出在列序和过滤条件的选择性上。

本文目录

    复合索引的列序决定了它能服务哪类查询:等值条件在前,范围条件在后。反过来写,等值条件之后的列基本用不上。

    sql
    CREATE INDEX idx_orders_user_status_created
      ON orders (user_id, status, created_at DESC);
    等值在前、范围在后
    • 查询里只用到 status 时,这个索引通常不会被选,因为前导列缺失
    • 把 status 放第一位会让 user_id 的过滤能力下降
    • 真正的高频查询应该单独建索引,而不是让一个索引服务所有场景

    最后我把两个高频查询分别建了索引,删掉了那个谁都用不上的中间产物。写入压力略降,慢查询也消失了。

    渝ICP备2026027925号-1