ClickHouse 列式存储设计 | 青训营笔记

246 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天,本次clickhouse的设计进行了学习,其中还有对于列式存储和行式存储的比较。

行存VS存储
优点:
  • 行存:数据被保存在一起,insert/update容易。
  • 列存:查询时只有涉及到的列会被读取;投影很高效;任何列都能作为索引;便于做延迟物化和向量化计算;压缩效率高,每一列可以使用不同的压缩算法。
缺点:
  • 行存:选择时即使只涉及某几列,所有数据都会被读取
  • 列存:选择完成时,被选择的列要重新组装;insert/update比较麻烦;点查询不适合。
适用场景:
  • 行存:点查询(返回记录少,基于索引的简单查询);增、删、改操作较多
  • 列存:统计分析类查询(OLAP);即时查询(查询条件不确定,行存表扫描难以使用索引)
clickhouse存储设计:

分布式表:不存储数据,用于将查询路由到集群的各个节点

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

本地表:实际存储数据的表

part、partition、column、index、hash index:
  • part:物理文件夹的名字
  • partition:逻辑结构
  • column:每个column是一个文件,所有column文件都在自己的part文件夹下
  • index:索引,每个column都有列索引,每个part有一个主键索引
  • hash index:将输入的key通过一个hashfunction映射到一组bucket上;每个bucket都包含一个指向一条记录的地址;哈希索引在查找的时候只适用于等值比较
B-Tree:
  • 数据写入是有序的,支持增删改查
  • 每个节点有多个孩子节点
  • 每个节点都按照升序排列key值
  • 每个key有志向左右孩子节点的引用(左孩子节点保存的key都小于当前key,右孩子节