postgresql , brin , 块级索引 , 并行 , 序列
brin索引的原理很简单,每个数据块(或者每一段连续的数据块)记录了其中的元数据(最大值,最小值,平均值,count,avg,null值个数等),当每个数据块存储的数据范围错开(边界清晰)时,块级索引的效率就非常高。
例如测试表
id边界清晰的例子:
id边界模糊的例子:
边界清晰,指不同的数据块没有交集,或者少量交集,而边界模糊,指数据块的交集很多,数据存储散乱。
为什么边界模糊性能不好呢?
例如
这条sql,在边界清晰时,搜索1号数据块即可。
而在边界模糊时,需要搜索1,2,3个数据块。
在实际业务中,我们可能会使用自增序列,作为时序字段,当串行(单进程)写入时,序列值和行号(堆表物理存储)线性相关,而当并行写入时,情况可能会变得糟糕(仅仅当使用了大步调时)。
怎么优化呢?
1、串行写入
线性相关性 = 1
brin性能
2、并行写入
线性相关性,略差,但依旧很好
3、并行写入,放大序列步调,散列问题出现
线性相关性,直线下降
1、使用单步序列。单步序列不会因为并发增加而导致离散度增加。
2、使用系统时间字段,系统时间与单步序列效果一样,即使并发写入,也不会导致离散度增加。
使用连续自增值的字段,创建brin索引就是很靠谱的。