Apache Doris 在底层采用了怎样的列式存储结构?这种列式存储和传统的行式存储相比,在数据组织、读写性能和适用场景上有哪些本质区别?
考察说明
考察对 Doris 列式存储设计的理解及其与行存储的差异,评估分布式 OLAP 存储基础。
回答思路
- 【回答框架 1】Doris 的列式存储以列族为单位组织数据,每列独立编码和压缩,并配合前缀索引、ZoneMap 索引和 BloomFilter 索引来加速查询。数据按分区分桶存储,每个桶内是列式文件,支持高压缩比。
- 【回答框架 2】与行存储的核心区别在于数据物理布局:行存将一行多列连续存放,适合整行读取和频繁更新;列存将同一列连续存放,查询只需读取涉及的列,大幅减少 IO,适合大范围聚合和扫描。
- 【回答框架 3】列存在写入时通常需要缓冲批量数据后落盘,随机写入成本高;行存支持高频点更新和插入。Doris 通过追加写和后台合并机制优化写入,但依然更适合批量导入和 OLAP 场景。
- 【回答框架 4】列式存储天然利于压缩,同一列数据类型一致,压缩率高;行存储压缩率低。但列存对点查询(如按主键查一行)不如行存高效,需依赖索引辅助。
- 【回答框架 5】Doris 针对列存设计了智能索引和向量化执行引擎,查询时只物化必要的列,进一步减少内存和 CPU 开销,这是其高性能查询的关键。
- 【关键点 1】列式存储按列独立编码压缩,结合前缀索引和 ZoneMap 减少扫描范围。
- 【关键点 2】列存适合 OLAP 的大范围聚合和扫描,行存适合 OLTP 的整行读写和点更新。
- 【关键点 3】Doris 列存写入偏批量追加,随机写性能弱于行存,但通过合并机制缓解。
- 【关键点 4】高压缩比是列存显著优势,同一列数据类型一致利于压缩。
- 【关键点 5】列存点查询需索引辅助,整体不如行存直接。
- 【易错点 1】不要将列式存储描述成所有查询都快,点查和频繁更新场景反而不如行存。
- 【易错点 2】不要把 Doris 的写入优化等同于支持任意高频随机写,其设计重点是批量导入。
- 【易错点 3】注意列存压缩率和查询加速依赖具体数据类型和查询模式,不能一概而论。