列式存储 | 青训营笔记
这是我参与「第五届青训营」伴学笔记创作活动的第 12 天,本文是课程「列式存储」的学习笔记。
数据库的架构
-
Client
-
Parser
词法分析,语法分析,生成AST树 (Abstract syntax tree) 3. Analyzer
变量绑定、类型推导、语义检查、安全、权限检查、完整性检查等,为生成计划做准备
-
Analyzer
变量绑定、类型推导、语义检查、安全、权限检查、完整性检查等,为生成计划做准备
-
Optimizer
-
为查询生成性能最优的执行计划
-
进行代价评估
-
Executor 将执行计划翻译成可执行的物理计划
-
Storage engine
a. 管理内存数据结构【index、内存数据、缓存(Query cache、Data cache、Index cache)】
b. 管理磁盘数据【磁盘数据的文件格式、磁盘数据的增删查改】
c. 读写算子【数据写入逻辑、数据读取逻辑】
一个sql的执行流程
设计数据库存储的要点
- 性能瓶颈在哪里:数据选择、数据读取、构造内存数据、计算
- 选择什么样的数据格式:是否可以并发处理、是否可以构建索引、行存,列存 或者 行列混合存储
- 选择什么样的索引:读写的方式:读多写少、读少写多、点查场景、分析型场景
列式存储
什么是列存
-
行存的存储
-
列存的存储
列存的优点
a. 数据压缩
- 数据压缩可以使读的数据量更少,在IO密集型计算中获得大的性能优势
- 相同类型压缩效率更高
- 排序之后压缩效率更高
- 可以针对不同类型使用不同的压缩算法
- 几种常见的压缩算法
b. 数据处理
【查询优化】1.可以选择特定的列做计算而不是读所有列 2.对聚合计算友好 【延迟物化】
- 物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,Join
- 缓存友好
- CPU / 内存带宽友好
- 可以利用到执行计划和算子的优化,例如filter
- 保留直接在压缩列做计算的机会