PostgreSQL 索引体系总览
PostgreSQL 的索引能力远不止"几种数据结构",它提供了一个可扩展的数据类型、运算符、操作类、索引访问方法、规划器协同框架。在这个框架上,不仅内核自带了多种索引类型,还支持 pgvector、PostGIS、MobilityDB 等扩展,解决标量、向量、空间、时间、时空等不同维度的搜索问题。
- PostgreSQL 索引基础架构 - 索引实现原理与底层数据结构
- PostgreSQL 索引性能优化原理 - 性能优化的五层原理与 HOT/VACUUM
- GIN 索引详解 - 倒排索引的实现与应用
- pgvector 向量索引 - 高维向量相似搜索
- PostGIS 空间索引 - 地理信息的索引与查询
- 时间区间与时空索引 - 时间区间与时空数据的索引方案
四层框架理解 PostgreSQL 索引
可以把 PostgreSQL 索引理解成四层:
第 1 层:逻辑功能
"帮查询少看数据"
第 2 层:物理结构
B-tree / Hash / GIN / GiST / SP-GiST / BRIN 各自组织 page 与 entry 的方式不同。
第 3 层:执行器接口
索引方法吐出 TID;heap 负责可见性;必要时 recheck。
第 4 层:真实性能
由统计信息、回表代价、MVCC 版本垃圾、VACUUM、HOT、visibility map、页分裂、索引大小共同决定。
标量世界:内核索引类型
内置访问方法
截至 PostgreSQL 18,核心索引类型是:
- B-tree - 默认、最常用、最重要
- Hash - 哈希桶结构,专做等值
- GiST - 广义搜索树
- SP-GiST - 空间划分树
- GIN - 倒排索引
- BRIN - 块范围摘要索引
官方扩展里常见的
- bloom - 基于 Bloom filter 的 access method
- btree_gist - 让很多普通数据类型以 GiST 风格参与索引
- btree_gin - 让很多普通类型以 GIN 风格参与组合索引场景
SQL 功能形态
这些不是新的 access method,而是"索引定义方式":
- 单列索引
- 多列索引
- 唯一索引
- 部分索引(partial index)
- 表达式索引(expression index)
- 覆盖索引 /
INCLUDE - 并发创建索引
CREATE INDEX CONCURRENTLY
扩展世界:向量、空间、时间、时空
向量世界:pgvector
pgvector 用 HNSW / IVFFlat 做 ANN(近似最近邻)搜索,解决高维向量相似搜索问题。详见 pgvector 向量索引。
空间世界:PostGIS
PostGIS 借 GiST 实现 R-tree 风格空间索引,解决二维/三维空间对象的包含、相交、距离、最近邻问题。详见 PostGIS 空间索引。
时间世界:range/multirange
PostgreSQL 原生 range/multirange + GiST / exclusion constraints,解决时间段重叠、冲突约束问题。详见 时间区间与时空索引。
时空世界:空间索引 + 时间区间索引协同
空间索引 + 时间区间索引协同,或 MobilityDB 这种专门模型,解决"在某时间窗口内,哪些对象在某空间区域"的问题。详见 时间区间与时空索引。
选型图
相似搜索 / RAG / Embedding 检索
选 pgvector
- 几十万到上亿向量:考虑 HNSW / IVFFlat
- 需要结构化过滤:把租户、状态、时间等条件一起设计
地图、POI、行政区、围栏、距离、最近站点
选 PostGIS
geometry用于投影平面分析geography用于地球表面距离语义- 主要索引用 GiST
预约冲突、时间区间重叠、班表、可用窗口
选 PostgreSQL range/multirange + GiST/exclusion constraint
这是原生强项。
轨迹、移动对象、真正的时空对象
优先看 PostGIS + MobilityDB
而不是试图只用普通 timestamp + point 硬拼一切。
工程判断:不要混淆三种"最近邻"
ORDER BY x <-> con B-tree/btree_gist:标量或某些普通类型的距离近邻ORDER BY geom <-> pointon PostGIS/GiST:空间近邻ORDER BY embedding <-> vecon pgvector/HNSW or IVFFlat:高维向量近邻
SQL 长得像,底层完全不同。
下一步
如果要从头理解 PostgreSQL 索引的实现原理,建议从 PostgreSQL 索引基础架构 开始。
如果关注性能优化和实际调优,建议直接看 PostgreSQL 索引性能优化原理。
如果关注特定应用场景(向量搜索、空间查询、时间区间),可以直接跳转到对应的专题文档。