部分索引
PostgreSQL 中的部分索引是什么?
部分索引只覆盖满足 WHERE 条件的行,因此当查询针对的是表中一个明确的子集时,索引会更小、更快。
部分索引是基于表中一部分行建立的索引,这部分行由 CREATE INDEX ... WHERE 中的条件定义。只有满足该条件的行才会有索引条目。
当查询集中在表中一小部分数据上(例如未完成的任务或未支付的订单),而大部分行很少被查询时,部分索引的收益最明显。只有当规划器能够证明查询的 WHERE 子句蕴含索引条件时,才能使用该索引,因此查询条件要写得与索引条件相匹配。部分唯一索引还可以只在该子集内保证唯一性。
示例
该示例只为 1% 尚未完成的任务建立索引。EXPLAIN 显示查询未完成任务时使用了 tasks_open_idx。
CREATE TABLE tasks (id int PRIMARY KEY, done boolean NOT NULL, title text);
INSERT INTO tasks
SELECT g, g % 100 <> 0, 'task ' || g FROM generate_series(1, 100000) AS g;
CREATE INDEX tasks_open_idx ON tasks (id) WHERE NOT done;
ANALYZE tasks;
EXPLAIN SELECT id, title FROM tasks WHERE NOT done;适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。