B-tree、Hash、GiST 与 GIN 索引
比较 PostgreSQL 中的主要索引类型,并为等值、范围、几何、JSON 和全文查询选择合适的索引
B-tree、Hash、GiST 与 GIN 索引 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
索引类型概览
PostgreSQL 有多种索引类型,每种都针对不同的访问模式进行了优化:
- B 树 — 相等和范围查询(默认)
- 哈希 — 仅支持相等查询
- GiST — 几何、全文和自定义查询
- GIN — 复合值(数组、JSONB、全文)
- BRIN — 块范围索引,适用于大型有序表
- 空间分区树 — 空间分区树结构
B 树:默认选择
95% 的情况下都会使用它。支持 =、<、<=、>、>=、BETWEEN 和 ORDER BY:
CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);哈希索引
仅支持相等查找。自 PG 10 起可安全应对崩溃。对于纯相等查询,它比 B 树更小、速度略快,但适用场景非常有限:
CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.GiST 索引
GiST(通用搜索树)是一种可插拔的索引,支持范围类型、几何类型、IP 地址和全文搜索:
CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.
CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.GIN 索引
GIN(通用倒排索引)最适合复合值查询,其中每个项目都对应许多行:
CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators
CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queriesBRIN 索引
BRIN 会为每 N 个页面汇总每个值范围。它非常小(对于太字节级表只需几 KB),但只有在数据按照索引列进行物理排序时才有效:
CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.大小比较
对于一个十亿行的表:
- BIGINT 上的 B 树:约 30 GB
- TIMESTAMPTZ 上的 BRIN:约 1 MB
BRIN 小得多,但只有对于顺序或有序查询才优于 B 树。
选择索引类型
决策流程:
- 标量上的相等和范围查询 → B 树
- 大型标量集合上的相等查询 → B 树(只有经过测量后才考虑哈希)
- 数组 / JSONB / 全文 → GIN
- 范围类型、几何数据、模糊文本 → GiST
- 大型有序表、仅追加数据 → BRIN
GIN 的权衡
对于“找出所有包含 X 的行”这类查询,GIN 速度最快,但 INSERT/UPDATE 比 B 树慢。对于写入非常频繁的表,可以考虑使用 fastupdate=off 来控制 GIN 的待处理列表。
运算符类
每种索引类型都适用于特定的运算符。JSONB 使用 jsonb_path_ops 可以建立更小、更快、仅用于包含查询的索引:
CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.不同类型的复合索引
B 树复合索引使用最左前缀匹配。GIN 复合索引可以使用,但体积更大;通常应分别创建单列 GIN 索引。
回顾
应根据查询选择合适的索引类型。
- B 树:默认选择
- GIN:数组 / JSONB / 全文
- GiST:范围 / 几何数据 / 模糊查询
- BRIN:顺序数据 / 仅追加数据
快速检查
您要为 TEXT[] 列建立索引,以支持“包含”查询。哪种索引类型最合适?
用 AI 导师学习 SQL — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 46
- 课程
- 183
常见问题解答
「B-tree、Hash、GiST 与 GIN 索引」课时是免费的吗?
是的 — 「B-tree、Hash、GiST 与 GIN 索引」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「B-tree、Hash、GiST 与 GIN 索引」这节课中我会学到什么?
比较 PostgreSQL 中的主要索引类型,并为等值、范围、几何、JSON 和全文查询选择合适的索引 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「B-tree、Hash、GiST 与 GIN 索引」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- B-tree、Hash、GiST 与 GIN 索引
- 复合索引与列顺序
- 部分索引与表达式索引
- 索引维护与膨胀