这是我参与「第五届青训营 」笔记创作活动的第14天
一、本文内容:
-
数据库基本概念
-
列式存储
-
ClickHouse存储设计
-
ClickHouse典型应用场景
二、详细介绍
列式存储
什么是列存
- 行存的存储
- 列存的存储
列存的优点
a. 数据压缩
- 数据压缩可以使读的数据量更少,在IO密集型计算中获得大的性能优势
- 相同类型压缩效率更高
- 排序之后压缩效率更高
- 可以针对不同类型使用不同的压缩算法
- 几种常见的压缩算法
b. 数据处理
【查询优化】1.可以选择特定的列做计算而不是读所有列 2.对聚合计算友好
【延迟物化】
- 物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,Join
- 延迟物化:尽可能推迟物化操作的发生
- 缓存友好
- CPU / 内存带宽友好
- 可以利用到执行计划和算子的优化,例如filter
- 保留直接在压缩列做计算的机会
【向量化】
- SIMD
- single instruction multiple data,对于现代多核CPU,其都有能力用一条指令执行多条数据
- 对于代码
for (size_t i = 0; i < 100; ++i) c[i] = a[i] + b[i];
非向量化执行
c[0] = a[0] + b[0]; c[1] = a[1] + b[1];
如果这时候CPU也可以并行的计算我们写的代码,那么理论上我们的处理速度就会是之前代码的100倍,幸运的是SIMD指令就是完成这样的工作的,用SIMD指令完成这样代码设计和执行就叫做向量化
- 执行模型
- 数据需要按批读取 函数的调用需要明确数据类型
-
列存数据库适合设计出这样的执行模型,从而使用向量化技术
列存 VS 行存
本文如有不足之处,欢迎大家指出