PG 高级索引实战:GIN/GiST/BRIN/B-tree——不同场景用对索引
引言 从 MySQL 转 PostgreSQL 的团队,第一个月往往觉得"索引嘛,还不都是 B+ 树那一套",直到在 SQL 里写下 WHERE tags @> ARRAY['新品'] 和 WHERE detail @> '{"city":"上海"}' 才发现:B-tree 对数组、JSONB、全文检索、几何范围这些条件根本无能为力——你可以给数组列建 B-tree,但它只索引整个数组字面值,永远不会为"数组包含某个元素"这类查询服务。 PostgreSQL 与 MySQL 在索引上最大的不同,是它把索引框架做成了可扩展的:不同的数据形态和查询模式,配不同物理结构的索引。这篇文章讲清生产中最常用的四类——B-tree(默认主力)、GIN(倒排,JSONB/数组/全文检索)、GiST(几何/模糊/最近邻)、BRIN(超大有序表的极简索引),每个都给建索引语句、匹配的查询操作符、EXPLAIN 验证方法,以及体积/写入代价的实测量级。选错索引类型时"明明建了索引却走全表扫"的困惑,看完这篇就没了。 一、先有全局观:四种索引解决四种不同的问题 索引物理结构直觉最擅长的查询典....