除了默认的 B-tree,PostgreSQL 提供了几种专门化的索引类型 — GIN、GiST、BRIN、Hash — 每种都适合不同的数据和查询模式,还有 partial 和 expression 索引提供灵活性。选择正确的索引类型可以大幅提高专门查询的性能。
B-tree — 默认(最常见)
INDEX idx_users_email users(email);
除了默认的 B-tree,PostgreSQL 提供了几种专门化的索引类型 — GIN、GiST、BRIN、Hash — 每种都适合不同的数据和查询模式,还有 partial 和 expression 索引提供灵活性。选择正确的索引类型可以大幅提高专门查询的性能。
INDEX idx_users_email users(email);
B-tree 是默认索引,处理大多数情况 — 相等性、范围和普通列的排序。
-- GIN (Generalized Inverted Index) — for values CONTAINING multiple items
CREATE INDEX idx_attrs ON products USING GIN (attributes); -- JSONB
CREATE INDEX idx_tags ON posts USING GIN (tags); -- arrays
CREATE INDEX idx_search ON docs USING GIN (to_tsvector('english', body)); -- full-text
-- great for: JSONB containment, array membership, full-text search
GIN 索引对 JSONB、数组和全文搜索 至关重要 — 用于检查包含或成员关系的查询。
-- GiST — geometric, range, nearest-neighbor (e.g. PostGIS, range types)
CREATE INDEX idx_geo ON places USING GiST (location);
-- BRIN (Block Range INdex) — tiny index for LARGE tables with naturally-ordered data
CREATE INDEX idx_time ON logs USING BRIN (created_at); -- great for huge time-series
-- tiny size, efficient for large append-only/ordered data
-- Hash — equality only (=); rarely needed (B-tree handles equality too)
CREATE INDEX idx_hash ON t USING HASH (col);
-- PARTIAL index — index only SOME rows (smaller, targeted)
CREATE INDEX idx_active ON users(email) WHERE active = true; -- only active users
-- EXPRESSION index — index a computed value
CREATE INDEX idx_lower_email ON users(LOWER(email)); -- for case-insensitive lookups
SELECT * FROM users WHERE LOWER(email) = '[email protected]'; -- uses the index
Partial 索引(仅索引相关行 — 更小、更快)和 expression 索引(索引计算值 — 启用基于索引的函数查询)是强大、灵活的工具。
理解 PostgreSQL 的各种索引类型是 性能优化 的宝贵知识,因为对于给定的数据和查询模式选择正确的索引类型可以大幅加速那些默认 B-tree 处理不佳或根本无法处理的查询。
虽然 B-tree(默认)覆盖大多数情况(相等性、范围、排序),但专门化类型为专门数据解锁性能:GIN 对于 JSONB、数组和全文搜索 至关重要(包含/成员关系查询 — 使 Postgres 强大的 JSONB 和数组特性性能高效);GiST 处理几何、范围和最近邻查询(PostGIS 地理空间、范围类型);BRIN 为 大型自然排序表 提供微小、高效的索引(如时间序列/仅追加数据 — 对于全 B-tree 成本过高的超大表是宝贵的选择)。
知道哪种索引类型适合哪种场景(GIN 用于 JSONB/数组/全文搜索、GiST 用于几何/范围、BRIN 用于大型有序数据)是优化 Postgres 高级特性的关键。
同样宝贵的是 partial 索引(仅索引相关行 — 当查询子集时更小且更高效,如活跃用户)和 expression 索引(索引计算值 — 启用快速基于函数的查找,如不区分大小写的电子邮件搜索,普通索引无法支持)。
由于索引选择显著影响查询性能,而且由于 Postgres 的专门化索引类型(特别是 JSONB/数组/全文搜索的 GIN)正是使其高级数据类型性能高效的原因,理解索引类型以及何时使用每种 — 包括 partial 和 expression 索引 — 是优化 PostgreSQL 数据库的宝贵、频繁相关的知识,区分能够为多样查询模式快速运行 Postgres 的开发人员,也是充分利用数据库完整性能能力的关键方面。