这是我参与「第五届青训营」伴学笔记创作活动的第 5 天,本文主要介绍了数据库列存储及ClickHouse。
列式存储
列式存储优点
数据压缩
- 数据压缩可以使读的数据量更少,在IO密集型计算中获得更大的性能优势
- 相同类型压缩效率更高
- 排序之后压缩效率更高
- 可以针对不同类型使用不同的压缩算法
LZ4
- 重复项越多或者越长,压缩率就会越高
Run-length encoding
- 压缩重复的数据
- 可以在压缩数据上直接计算
Delta encoding
- 将数据存储为连续数据之间的差异,而不是直接存储数据本身
- 特定算子也能直接在压缩数据上计算
数据选择
- 可以选择特定的列做计算而不是读所有列
- 对聚合计算友好
延迟物化
- 物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算。
- 延迟物化:尽可能推迟物化操作的发生
- 缓存友好
- CPU/内存带宽友好
- 可以利用到执行计划和算子的优化,例如filter
- 保留直接在压缩列做计算的机会
向量化
- 用SIMD指令完成的代码设计和执行的逻辑叫做向量化
- 数据格式:需要处理多个数据,因此数据需要连续内存;需要明确数据类型
- 执行模型:数据需要按批读取;函数的调用需要明确数据类型
ClickHouse概述
ClickHouse是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用 SQL 查询实时生成分析数据报告。
ClickHouse应用场景
大宽表存储和查询
- 大宽表查询
- 可以建非常多的列
- 可以增加,删除,清空每一列的数据
- 查询的时候引擎可以快速选择需要的列
- 可以将列涉及到的过滤条件下推到存储层,从而加速查询
- 动态表结构
- map中的每个key都是一列
- map中的每一列都可以单独的查询
- 使用方式同普通列,可以做任何计算
离线数据分析
- 数据导入
- 数据按列导入
复杂类型分析
- bitmap索引
- bitmap64类型
- lowCardinality
- 减少数据存储和读写的IO使用
- 可以做运行时的压缩数据过滤
总结
- ClickHouse是标准的列存结构
- 存储设计是LSM-Tree架构
- 使用稀疏索引加速查询
- 每个列都有丰富的压缩算法和索引结构
- 基于列存设计的高效的数据处理逻辑