知识卡片

BRIN块范围索引:用粗粒度摘要信息换取更快写入和更小体积

普通读书笔记卡

内容

BRIN(Block-Range Index,块范围索引)不像B-Tree那样为每一条记录精确建立索引项,而是把数据按物理存储块分组,为每一组块保存一份摘要信息(如该组块内某列的最大值、最小值),查询时先用这份粗粒度摘要过滤掉明显不满足条件的整组数据块,再对剩下的块做扫描,这与Oracle Exadata的Storage Index思路相似。这样的设计带来一组典型取舍:索引体积比B-Tree小得多、写入(Insert)性能比B-Tree快得多,因为不需要为每条新记录维护精确的索引结构;但查询(Select)性能通常比B-Tree慢,因为它只能做粗粒度过滤、无法精确定位到具体记录。这决定了它的适用场景是”数据按某种顺序自然排列(如按日期递增写入的日志表)、且查询以等值或范围过滤为主、同时要求高速写入”的场景,而不适合作为随机分布数据的主索引。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.10 从Postgres95到PostgreSQL9.5:新版亮眼特性"节,"6.10.3 PostgresSQL9.5的亮眼特性"(源文件:_epub-src/OEBPS/Text/Chapter6_10_4.xhtml) - 结论依据:原文说明"BRIN(Block Range Index)是指保存数据块的值的摘要信息,如存储某一组块里所有记录中的最大、最小值,与Exadata的Storage Index相似……从上图中我们可以看到BRIN比B-Tree小很多……我们可以明确看到,B-Tree下Insert性能比BRIN慢了一倍,因此对于只要进行少量'等于'或'范围查询'操作,但要求高速数据写入的场景是十分适用的。如:按日期存放的日志表",直接支撑本卡片结论。 - 原始内容:BRIN(Block Range Index)是指保存数据块的值的摘要信息,如存储某一组块里所有记录中的最大、最小值,与Exadata的Storage Index相似……B-Tree下Insert性能比BRIN慢了一倍,因此对于只要进行少量"等于"或"范围查询"操作,但要求高速数据写入的场景是十分适用的。