天天看点

高并发写入存储线性相关性优化

postgresql , brin , 块级索引 , 并行 , 序列

brin索引的原理很简单,每个数据块(或者每一段连续的数据块)记录了其中的元数据(最大值,最小值,平均值,count,avg,null值个数等),当每个数据块存储的数据范围错开(边界清晰)时,块级索引的效率就非常高。

例如测试表

id边界清晰的例子:

id边界模糊的例子:

边界清晰,指不同的数据块没有交集,或者少量交集,而边界模糊,指数据块的交集很多,数据存储散乱。

为什么边界模糊性能不好呢?

例如

这条sql,在边界清晰时,搜索1号数据块即可。

而在边界模糊时,需要搜索1,2,3个数据块。

在实际业务中,我们可能会使用自增序列,作为时序字段,当串行(单进程)写入时,序列值和行号(堆表物理存储)线性相关,而当并行写入时,情况可能会变得糟糕(仅仅当使用了大步调时)。

怎么优化呢?

1、串行写入

线性相关性 = 1

brin性能

2、并行写入

线性相关性,略差,但依旧很好

3、并行写入,放大序列步调,散列问题出现

线性相关性,直线下降

1、使用单步序列。单步序列不会因为并发增加而导致离散度增加。

2、使用系统时间字段,系统时间与单步序列效果一样,即使并发写入,也不会导致离散度增加。

使用连续自增值的字段,创建brin索引就是很靠谱的。