PostgreSQL 的所有索引均属于二级索引(Secondary Indexes),索引结构与数据表的主数据区(堆表 Heap)物理分离存储。因此在常规索引扫描中,每次定位到索引条目后都必须进行一次随机 I/O 回表访问堆表以提取整行数据。
为了解决回表带来的 I/O 开销,系统支持仅索引扫描(Index-Only Scan):当某条查询所需的所有字段列均已全部包含在该索引自身内部时,系统可直接从索引条目中提取数据返回客户端,完全不需要物理回表访问堆表。
利用 INCLUDE 子句可以构建专用的覆盖索引(Covering Index):
CREATE INDEX tab_x_y ON tab(x) INCLUDE (y);
其中字段 x 作为可被检索的搜索键参与 B 树分叉索引,而字段 y 则仅作为附加数据载荷(payload)原样保存在叶子节点中。这使得针对 SELECT y FROM tab WHERE x = 'key' 的查询能够以纯粹的仅索引扫描毫秒级响应。