列式储存相关笔记|青训营笔记

69 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

个人笔记,有误请指正。

列式存储(Column-oriented Storage)与行式储存相对,一个主键对应多行数据。OLTP(事务型数据库)大多采用行式存储,OLAP(分析型数据库)由于需要从不同维度分析大量数据,常常使用列式储存。

列式存储的优势体现在:1、存储上能节约空间,无需像行式储存一样,为所有key分配同样长的行浪费大量空间。2、可以使用LZ4等压缩算法对于重复数据进行压缩,甚至在压缩的数据上直接进行计算。3、可以储存数据之间的差异而不是数据本身。4、可以选择特定的列进行计算,不需要选定所有列。5、便于做延迟物化和向量化计算。6、依靠列式数据结构,使用列式储存的大多数据库都做了计算上的优化。

同样的,相对于行式储存,列式储存的增删查改较为麻烦,不适合大量事务访问。因而常用于统计分析类查询或者即时查询。

LZ4补充:

以括号代表压缩的重复项,(a,b)代表当前匹配到了从向前a个byte长度为b的重复项

压缩前abcde_bcdefgh_abcdefghxxxxxxx

压缩后:abcde_(5,4)fgh_(14,5)fghxxxxxxx

如(5,4) 代表向前5个byte,长度为4,即代表bcde为括号处的值。像所有的压缩算法一样,取最先且最长匹配到的字符串作为匹配值。重复项越多或者越长,压缩率就会越高。

压缩过程以至少4个bytes为扫描窗口查找匹配,每次移动1byte进行扫描,遇到重复的就进行压缩。
使用hash表记录并匹配已获得的字符串及位置。

扫描的步长是可以调整的,通过LZ4_compress_fast机制进行改变。步长变大,压缩解压速度提高,但压缩率不变小。