数据仓库与 OLAPColumnar Storage
列式存储 是什么?
同一列的数据连续存放,查询只读用到的列
类比:按科目分册的成绩单,查数学只翻数学那本
行存 vs 列存
行存把一行的字段挨着放,适合“取一整行”(点查、事务);列存把同一列的值挨着放,适合“对某一列做聚合”(sum、avg、group by)。
分析查询通常只用到几十列里的三五列,列存能少读 80% 以上的数据,这是 OLAP 快的第一个原因。
为什么压缩率高
同一列的数据类型相同、取值相近,压缩算法效果特别好。比如时间戳列可以用 delta 编码,枚举列可以用字典编码,压缩比轻松到 5~10 倍。压缩率高又反过来减少了 IO。
代价
取一整行要拼很多列,点查比行存慢;单行更新要重写整列文件,所以列存数据库基本不支持高频更新。选型时先想清楚是“分析”还是“交易”,别指望一个引擎两头都强。