列式存储优点
- 快速聚合查询:当执行涉及大量读取但只针对少数几列的查询时(如统计分析、聚合操作),列式存储能够显著提高性能,因为它只需要读取相关的列,而不需要扫描整个表。
- 高效的数据压缩:因为同一列的数据类型通常是一样的,并且往往具有相似的值域,所以可以更有效地进行压缩,减少磁盘空间占用。在列式存储中相邻的数据类型是一致性的,并且通常会出现前缀一样,甚至完全相同的数据的特点,比如在用户的地址信息中,同一个地方的用户,省市县都是完全相同的,这非常适合使用 RLE 压缩、前缀压缩和字典压缩等压缩算法去压缩。
- RLE 压缩:“AAABBBBCC” ⇒ 3A4B2C,适用场景较少。图像 mask 存储的时候就先使用 RLE 压缩,然后进一步转换
- 字典压缩:比如某一列是 enum 类型,那么就直接用数字来表示,从而压缩文本。
- 写入成本较高:由于数据是按列存储的,更新或插入记录可能需要对多个文件进行修改,这会增加写操作的成本。因此,列式存储更适合于以读为主的工作负载。
- 索引优化:对于经常被查询的列,可以创建高效的索引,进一步加快查询速度。
列式存储场景
- 大数据分析场景
- 宽表存储,按列读取:数据往往以宽表的形式存储,一个表上百列,但是一次分析往往只关心一列或者几列。
- 读多写少:一次写入,多次读取,几乎不更新。
- 数据量大:大数据会存储全站的所有数据,包括日志和数据库内的数据,并且会持续增加。
- 查询无规律,不能索引覆盖:在分析场景中,我们会通过各种维度和组合,来统计和分析数据,所以这些查询方式是无规律的,不可能全部通过索引来覆盖。
参考链接
18|分片(二):垂直分片和混合分片的 trade-off-深入浅出分布式技术原理-极客时间