ClickHouse | 青训营笔记

35 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天

  数据库根据数据存储形式分为关系型数据库和非关系型数据库;按部署方式分为单机数据库和分布式数据库;按使用场景分为 OLTP(Online Transactional Processing)和 OLAP(Online Anaclitical Processing)数据库。对于不同的业务,需要根据其特点选择不同的数据库。

列式存储

  相比于 MySQL 的行式存储,列式存储将数据按列进行存储,实现对相同数据类型数据的归并,有以下优点:

  • 更好的进行数据压缩:相同数据类型压缩、排序后压缩、可进行Run-length encoding(计数重复数据)、Delta encoding(只记录数据之间的差值)
  • 更快地找出需要的列中的数据
  • 延迟物化:物化指将数据生成用于输出或计算的行数据或内存数据的过程。
  • 更适合向量化:如今 CPU 普遍支持 SIMD(Single Instruction Multiple Data)以加速处理,向量化的数据才可进行这些操作。

  但是,列式存储也有一些缺点,比如不擅长点查询(查询一列数据)、Insert/Update 较复杂等。

ClickHouse 存储设计

  ClickHouse 将物理节点抽象成集群(cluster),创建表时需要制定存储表的集群。

  相比其他数据库使用 B-Tree 或 B+-Tree 作为索引,ClickHouse 使用 LSM-Tree(Log Structured Merge Tree),以便应对海量数据的压力。

  ClickHouse 的两个主要的数据结构为 SSTable 和 Memtable,SSTables 将 key 按顺序写入磁盘,每一个写入单位称为一个 segment,这些 key 不可修改,只能增量更新;Memtable 位于内存中,当其占用空间达到阈值后会被写入磁盘中。

  ClickHouse 将 segment中距离为定长的 key 作为索引,用于加速查找,称为稀疏索引。

  已经写入磁盘的 Segment 也会有专门的线程对其进行压缩、整理和排序。

本文若有不足之处,欢迎纠正(≧^.^≦)喵~

我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读