索引扫描
PostgreSQL 中的索引扫描是什么?
索引扫描利用索引找到匹配的行,再从表中取出这些行。EXPLAIN 将其显示为 Index Scan;Index Only Scan 则可以跳过对表的访问。
在索引扫描中,PostgreSQL 遍历索引,找到满足查询条件的条目,然后从表中读取对应的行。当查询只选取表中一小部分行时(例如按主键查找),这种方式效率很高。
EXPLAIN 中还会出现一些相关的访问方法。Bitmap Index Scan 先收集所有匹配行的位置,再按物理顺序读取表页,适合中等规模的结果集。当查询所需的每一列都在索引中时,Index Only Scan 仅凭索引就能回答查询,并且对于可见性映射标记为全部可见的页,会跳过对表的访问。
示例
该示例创建一张带主键的表(PostgreSQL 用 B-tree 索引来支撑主键),并让 EXPLAIN 分析按 id 查找的查询。输出显示 Index Scan using orders_pkey。
CREATE TABLE orders (id int PRIMARY KEY, customer_id int, total numeric);
INSERT INTO orders
SELECT g, g % 1000, g * 1.5 FROM generate_series(1, 100000) AS g;
ANALYZE orders;
EXPLAIN SELECT * FROM orders WHERE id = 42;适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。