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