这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天 今日继续学习数据库相关知识
数据库架构:
包含client->parser(词法分析,语法分析,生成AST树)->optimizer(为查询生成性能最优的执行计划,进行代价评估)->analyzer(变量绑定、类型推导、语义检查、完整性检查等)->executor(将执行计划翻译成可执行的物理计划并驱动其执行,再与存储引擎交互)
存储引擎
- 1、管理内存数据结构:索引,内存数据,缓存。
- 2、管理磁盘数据:磁盘数据的文件格式,磁盘数据的增删查改。
- 3、读写算子:数据写入逻辑,数据读取逻辑。
列式存储
目前清华的IoTDB时序数据库也是列存储,不过IoTDB主要存储时间序列下的数据。
数据压缩
- 数据压缩可以使读的数据量更少,在IO密集型计算中获得更大的性能优势
- 相同类型压缩效率更高
- 排序之后压缩效率更高
- 可以针对不同类型使用不同的压缩算法
列式存储的优点
- 重复项越多或者越长,压缩率就会越高。
- 压缩重复的数据
- 可以在压缩数据上直接计算
- 将数据存储为连续数据之间的差异,而不是直接存储数据本身
- 特定算子也能直接在压缩数据上计算
- 可以选择特定的列做计算而不是读所有列
- 对聚合计算友好
- 延迟物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,join。尽可能推迟物化操作的发生。
-
- 缓存友好
-
- CPU/内存带宽友好
-
- 可以利用到执行计划和算子的优化
-
- 保留直接在压缩列做计算的机会
- 向量化:
-
- SIMD:(single instruction multiple data),对于现代多核CPU,其都有能力用一条指令执行多条数据。用SIMD指令完成的代码设计核执行的逻辑就叫做向量化。
-
- 数据格式要求:需要处理多个数据,因此数据需要是连续内存,需要明确数据类型。
-
- 执行模型要求:数据需按按批读取,函数的调用需要明确数据类型。
行存VS列存:
总结
主要是列存储的优势。