PostgreSQL 索引体系详解:B-tree、GIN、GiST 与 BRIN
一、为什么 PostgreSQL 有这么多索引类型 很多人刚接触 PostgreSQL 索引时,会自然地用 MySQL B+Tree 的思路去理解所有索引:索引就是按字段值排序,然后通过树结构快速定位行。 这个理解对 B-tree 索引基本成立,但不能覆盖 PostgreSQL 的全部索引体系。PostgreSQL 支持多种索引访问方法,常见的有: B-tree:默认索引,适合等值、范围、排序。 Hash:适合等值查询,实际使用频率低于 B-tree。 GIN:通用倒排索引,适合数组、JSONB、全文搜索。 GiST:通用搜索树,适合范围、空间、相似、最近邻。 SP-GiST:空间分区搜索树,适合某些非平衡分布的数据结构。 BRIN:块区域索引,适合超大表且数据物理顺序相关的场景。 本文重点解释最常被问到、也最容易混淆的四类: B-tree GIN GiST BRIN 尤其会重点讲清楚: GIN 的 posting list 和 posting tree 是什么。 GIN 找到 TID 后如何回表。 多个高频 key 的 posting tree 是否会占用很大空间。 GiST 和 BRIN 都像“摘要索引”,但区别在哪里。 千万级、亿级表上应该如何选择索引。 二、先理解 PostgreSQL 的行位置:TID / CTID 在理解 GIN、GiST、BRIN 之前,要先理解 PostgreSQL 索引里常见的一个概念:TID。 TID 可以理解为一行数据在 heap 表里的物理位置,形式类似: 1 (block number, offset number) 也就是: ...