这是我参与「第五届青训营」伴学笔记创作活动的第 18 天
有关Mysql基础概念、SQL语法基础、MySQL存储引擎的知识在我之前的文章中已写过,这里不再进行赘述。
列式存储
下面是一个表段
id time name
1 2022-08-05 John
2 2022-09-04 Rose
3 2023-02-20 Ben
针对该表段,有:
行式存储:
1 2022-08-05 John
, 2 2022-09-04 Rose
列式存储:1, 2, 3
, 2022-08-05 2022-09-04 2023-02-20
列式存储的优点:
- 数据压缩:使读的数据量更少,在IO密集型计算中获得更大的性能优势
- 相同类型压缩效率更高
- 排序之后的压缩效率更高
- 可以针对不同类型使用不同的压缩算法
延时物化
物化的概念:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤、聚合计算、Join计算等操作
延时物化的概念:尽量推迟物化操作
优点:
- 缓存友好
- CPU/内存带宽友好
- 可以利用到执行计划和算子的优化,如filter
- 保留直接在压缩列做计算的机会
向量化
SIMD:Single Instruction Multiple Data
,CPU用一条指令执行多条数据。
如果CPU能够并行计算我们的代码,理论上处理速度会大大增加,SIMD指令就可以完成这样的操作。
用SIMD指令完成的代码设计和执行的逻辑就叫做向量化。
那么为了实现该技术,列式数据库有怎么样的设计模型?
- 按列读取
- 每种列类型定义数据读写逻辑
- 函数按列类型处理
行存储 、 列存储优缺点对比
ClickHouse存储设计
ClickHouse针对该特性有更新的表设计理念。
- 分布式表: 不存储数据,用于将查询路由到集群的各个节点。
- 本地表:实际存储数据的表
两个概念词汇:
cluster:逻辑集群,由多个节点组成
shard_key:指导数据写入分布式表时的分布方式
索引设计
Hash Index:将输入的Key通过哈希函数映射到一组Bucket上,每个Bucket都包含一个指向一条记录的地址。 哈希索引在查找的时候适用于等值比较
B树、B+树索引(数据都存储在孩子节点)
LSM-Tree:Log Structured merge Tree
一种为大吞吐写入场景而设计的数据结构。有两个branch:
- SSTables
- Memtable
未完待续~