背景
同一个联合索引有时帮助过滤,有时主要帮助排序。只背左前缀口诀,容易忽略查询实际扫描了多少数据。
核心判断
- 先列出等值条件、范围条件、ORDER BY 和 LIMIT,再选择列顺序。
- 检查 EXPLAIN 中的索引条件、过滤行数和排序节点。
- 同时计算索引对写入、磁盘和维护的成本。
最小示例
下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。
CREATE INDEX CONCURRENTLY idx_orders_user_status_created ON orders (user_id, status, created_at DESC);
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM orders WHERE user_id = 42 AND status = 'paid';
边界与误区
索引是否使用以及缺失前导列时是否有收益,要看版本、数据分布和计划。CREATE INDEX CONCURRENTLY 不能放在事务块中,失败后还要检查无效索引。
验证方式
用大租户、小租户和不同状态分别测计划,记录 buffers 与耗时。示例 EXPLAIN ANALYZE 会执行查询,线上需控制成本。
小结
索引列顺序要结合等值过滤、范围条件、排序和实际执行计划决定。