这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天 继续学习列存储设计。
ClickHouse存储设计
定义表结构
- 分布式表:不存储数据,用于将查询路由到集群的各个节点。
-
- cluster:逻辑集群,由多个节点组成
-
- shard_key:指导数据写入分布式表时的分布方式
- 本地表:实际存储数据的表
文件结构
part和partition:
- part是物理文件夹的名字
- partition是逻辑结构 part和column:
- 每个column都是一个文件
- 所有的cplumn文件都在自己的part文件下 column和index
- 一个part有一个主键索引
- 每个column都有列索引
索引设计
Hash Index: 1、将输入的key通过一个HashFunction映射到一组bucket上 2、每个bucket都包含一个指向一条记录的地址 3、哈希索引在查找的时候只适用于等值比较
B-tree
这是重点内容:
- 数据写入是有序的,支持增删查改
- 每个节点有多个孩子节点
- 每个节点都按照升序排列key值
- 每个key有两个指向左右孩子节点的引用
B+Tree
- 所有的数据都存储在叶子节点,非叶子节点只保存key值
- 叶子节点维护到相邻叶子节点的引用
- 可以通过key值做二分查找,也可以通过叶子节点做顺序访问
区别:
- 对于大数据量,B(B+)-Tree深度太高
- 索引数据量太大,多个列如何平衡查询和存储 ---->LSM-Tree
- OLAP场景写入量非常大,如何优化写入
LSM TREE
Log-structured merge-tree是一种为大吞吐写入场景而设计的数据结构
- 着重优化顺序写入
- 主要数据结构:
-
- 1.SSTables:
-
-
-
- Key按顺序存储到文件中,称为segment
-
-
-
-
-
- 包含多个segment
-
-
-
-
-
- 每个segment写入磁盘后都是不可更改的,新加的数据只能生成新的segment。
-
-
-
- 2.Memtable:
-
-
- 在内存中的数据保存在memtable中,大多数实现都是一颗Binary search tree
-
-
-
- 当memtable存储的数据到达一定的阈值时,就会按顺序写入到磁盘。
-
总结
后续还有数据查询,查询优化等内容需要继续学习。