SQL Academy · 课时

B-tree、Hash、GiST 与 GIN 索引

比较 PostgreSQL 中的主要索引类型,并为等值、范围、几何、JSON 和全文查询选择合适的索引

第 1 / 4 课13 个步骤

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 queries

BRIN 索引

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. B-tree、Hash、GiST 与 GIN 索引
  2. 复合索引与列顺序
  3. 部分索引与表达式索引
  4. 索引维护与膨胀
← 返回 SQL Academy