← 行间 技术 / Postgres
技术

Postgres 索引:何时用 BRIN

B-tree 是默认选择,但对某些表来说,它大得离谱。BRIN(Block Range Index)是另一条路:它不记录每一行的位置,只记录每一段数据块里的最小值和最大值。

它为什么这么小

一张按时间追加写入的日志表,几十亿行,B-tree 索引可能占好几个 GB。同样一列上的 BRIN 索引往往只有几百 KB——因为它每 128 个数据块才存一条摘要。查询时,它先用摘要排除掉大部分数据块,剩下的再顺序扫。

什么时候会失效

代价是:BRIN 只在数据的物理顺序和列的值高度相关时才有用。如果你的时间列是乱序插入的,或者表经历过大量随机 update,摘要区间会互相重叠,排除不掉任何块,索引就退化成一次全表扫描。

一句话:追加写、少更新、按索引列天然有序——满足这三条,BRIN 几乎是免费的午餐;否则老老实实用 B-tree。