这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天,本文主要以概括总结,全局记录为主,而不是作为细致的知识点讲解,细节之处多有疏忽还望多多包容。
一、本堂课重点内容:
- clickHouse 存储设计
二、详细知识点介绍:
表定义和结构
-
分布式表
- cluster:逻辑集群,由多个节点组成
- shard_key:指导数据写入分布式表的分布方式
-
本地表:实际存储数据的表
索引设计
Hash Index
- 将输入的 key 通过一个 HashFunction 映射到一组 bucket 上
- 每个 bucket 都包含一个指向一条记录的地址
- 哈斯索引在查找的时候只适用于等值比较
B-Tree
- 数据的写入是有序的,支持增删改查
- 每个节点由多个孩子节点
- 每个节点都按照升序排列 key 值
- 每个 key 有两个指向左右孩子节点的引用
- 左孩子节点保存的 key 都小于当前 key
- 右孩子节点的保存的 key 都大于当前 key
B+Tree
- 所有的数据都存储在叶子节点,非叶子节点只保存 key 值
- 叶子节点维护到相邻叶子节点的引用
- 可以通过 key 值做二分查找,可以通过叶子结点做顺序访问
小结
-
对于大数据量,B(B+) - tree 深度太高
-
索引数据量太大,多个列如何平衡查询和存储? 使用 LSM-Tree
-
OLAP 场景写入量非常大,如何优化写入?
- Log-structured merge-tree (LSM tree)是一种为大吞吐写入场景而设计的数据结构
-
着重优化顺序写入
-
主要数据结构
- SSTables
- Memtable
什么是SSTables
- key 按顺序存储到文件中,称为 segment
- 包含多个 segment
- 每个 segment写入磁盘后都是不可更改的,新加的数据只能生成新的 segment
Memtable
- 在内存中的数据保存在 memtable中,大多数实现都是一棵Binary search tree
- 当mentable 存储的数据达到一定的阈值的时候,就会按照顺序写入到键盘
三、课后个人总结:
- ClickHouse 的索引设计非常讲究,充分体现了数据结构的优美性