在 PostgreSQL 中,扫描(Scan)是指数据库执行引擎从表或索引中读取数据的方式。查询优化器(Query Planner)会根据表的统计信息、索引情况以及查询条件,自动选择代价(Cost)最低的扫描方式。 你可以通过在 SQL 语句前加 或 来查看 PostgreSQL 实际使用了哪种扫描方式。 以下是 PostgreSQL 中最常见的几种核心扫描方式: 1. 全表扫描 (Sequential Scan / Seq Scan) 工作原理:从表的第一个数据块(Page)开始,按顺序依次读取直到最后一个数据块。读取后,根据查询的 条件对每一行进行过滤。 适用场景: 表上没有相关的索引。 查询需要返回表中很大一部分数据(例如超过 10%-20%),此时顺序 I/O 的效率反而高于通过索引带来的大量随机 I/O。 表的数据量非常小(即使有索引,优化器也认为直接扫表更快)。 特点:纯顺序 I/O,但如果只查少数数据,效率极低。 2. 索引扫描 (Index Scan) 工作原理:分两步走。首先扫描索引树(通常是 B-Tree),找到满足条件的索引项,并获取对应的行物理位置(TID...