列存储设计学习| 青训营笔记

19 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天 继续学习列存储设计。

ClickHouse存储设计

定义表结构

  • 分布式表:不存储数据,用于将查询路由到集群的各个节点。
    • cluster:逻辑集群,由多个节点组成
    • shard_key:指导数据写入分布式表时的分布方式
  • 本地表:实际存储数据的表

文件结构

image.png part和partition:

  • part是物理文件夹的名字
  • partition是逻辑结构 part和column:
  • 每个column都是一个文件
  • 所有的cplumn文件都在自己的part文件下 column和index
  • 一个part有一个主键索引
  • 每个column都有列索引

索引设计

Hash Index: 1、将输入的key通过一个HashFunction映射到一组bucket上 2、每个bucket都包含一个指向一条记录的地址 3、哈希索引在查找的时候只适用于等值比较

image.png

B-tree

这是重点内容:

  • 数据写入是有序的,支持增删查改
  • 每个节点有多个孩子节点
  • 每个节点都按照升序排列key值
  • 每个key有两个指向左右孩子节点的引用

B+Tree

  • 所有的数据都存储在叶子节点,非叶子节点只保存key值
  • 叶子节点维护到相邻叶子节点的引用
  • 可以通过key值做二分查找,也可以通过叶子节点做顺序访问

区别:

  • 对于大数据量,B(B+)-Tree深度太高
  • 索引数据量太大,多个列如何平衡查询和存储 ---->LSM-Tree
  • OLAP场景写入量非常大,如何优化写入

LSM TREE

Log-structured merge-tree是一种为大吞吐写入场景而设计的数据结构

  • 着重优化顺序写入
  • 主要数据结构:
    • 1.SSTables:
        1. Key按顺序存储到文件中,称为segment
        1. 包含多个segment
        1. 每个segment写入磁盘后都是不可更改的,新加的数据只能生成新的segment。

image.png

    • 2.Memtable:
      • 在内存中的数据保存在memtable中,大多数实现都是一颗Binary search tree
      • 当memtable存储的数据到达一定的阈值时,就会按顺序写入到磁盘。

总结

后续还有数据查询,查询优化等内容需要继续学习。