Sparkle CodesSparkle
项目 / 数据库

PostgreSQL 索引体系总览

x
xpx
Dec 23, 2024
Editorial Insight
#PostgreSQL#性能优化#数据库#索引

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 <-> c on B-tree/btree_gist:标量或某些普通类型的距离近邻
  • ORDER BY geom <-> point on PostGIS/GiST:空间近邻
  • ORDER BY embedding <-> vec on pgvector/HNSW or IVFFlat:高维向量近邻

SQL 长得像,底层完全不同。

下一步

如果要从头理解 PostgreSQL 索引的实现原理,建议从 PostgreSQL 索引基础架构 开始。

如果关注性能优化和实际调优,建议直接看 PostgreSQL 索引性能优化原理。

如果关注特定应用场景(向量搜索、空间查询、时间区间),可以直接跳转到对应的专题文档。

BACK TO BLOG
The End of Interaction