[ PROMPT_NODE_23536 ]
query-composite-indexes
[ SKILL_DOCUMENTATION ]
## 为多列查询创建复合索引
当查询在多个列上进行过滤时,复合索引比多个单列索引更高效。
**错误(单独的索引需要位图扫描):**
sql
-- 两个单独的索引
create index orders_status_idx on orders (status);
create index orders_created_idx on orders (created_at);
-- 查询必须结合两个索引(较慢)
select * from orders where status = 'pending' and created_at > '2024-01-01';
**正确(复合索引):**
sql
-- 单个复合索引(等值检查的列放在最左侧)
create index orders_status_created_idx on orders (status, created_at);
-- 查询使用一个高效的索引扫描
select * from orders where status = 'pending' and created_at > '2024-01-01';
**列的顺序很重要** - 将等值列放在前面,范围列放在后面:
sql
-- 良好:status (=) 在 created_at (>) 之前
create index idx on orders (status, created_at);
-- 适用于:WHERE status = 'pending'
-- 适用于:WHERE status = 'pending' AND created_at > '2024-01-01'
-- 不适用于:WHERE created_at > '2024-01-01'(最左前缀规则)
参考:[多列索引](https://www.postgresql.org/docs/current/indexes-multicolumn.html)