ClickHouse-你没见过的列存储 (3)| 青训营笔记

76 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天,本文主要以概括总结,全局记录为主,而不是作为细致的知识点讲解,细节之处多有疏忽还望多多包容。

一、本堂课重点内容:

  • clickHouse 存储设计

二、详细知识点介绍:

表定义和结构

  • 分布式表

    • cluster:逻辑集群,由多个节点组成
    • shard_key:指导数据写入分布式表的分布方式
  • 本地表:实际存储数据的表

索引设计

Hash Index

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

B-Tree

  1. 数据的写入是有序的,支持增删改查
  2. 每个节点由多个孩子节点
  3. 每个节点都按照升序排列 key 值
  4. 每个 key 有两个指向左右孩子节点的引用
    • 左孩子节点保存的 key 都小于当前 key
    • 右孩子节点的保存的 key 都大于当前 key

B+Tree

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

小结

  • 对于大数据量,B(B+) - tree 深度太高

  • 索引数据量太大,多个列如何平衡查询和存储? 使用 LSM-Tree

  • OLAP 场景写入量非常大,如何优化写入?

    • Log-structured merge-tree (LSM tree)是一种为大吞吐写入场景而设计的数据结构
  • 着重优化顺序写入

  • 主要数据结构

    • SSTables
    • Memtable
什么是SSTables
  1. key 按顺序存储到文件中,称为 segment
  2. 包含多个 segment
  3. 每个 segment写入磁盘后都是不可更改的,新加的数据只能生成新的 segment
Memtable
  • 在内存中的数据保存在 memtable中,大多数实现都是一棵Binary search tree
  • 当mentable 存储的数据达到一定的阈值的时候,就会按照顺序写入到键盘

三、课后个人总结:

  • ClickHouse 的索引设计非常讲究,充分体现了数据结构的优美性

四、引用参考: