ClickHouse 列式存储 | 青训营笔记

40 阅读4分钟

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

数据库基本概念

数据库是结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。在现实中,数据、DBMS及关联应用一起被称为数据库系统,通常简称为数据库。

OLTP 数据库: OLTP (Online transactional processing) 数据库是一种高速分析数据库,专为多个用户执行大量事务而设计。

OLAP 数据库: OLAP (Online analytical processing) 数据库旨在同时分析多个数据维度,帮助团队更好地理解其数据中的复杂关系

  1. 大量数据的读写,PB级别的存储
  2. 多维分析,复杂的聚合函数
  3. 窗口函数,自定义UDF
  4. 离线/实时分析

数据库架构

image.png

列式存储

列存的优点

数据压缩

  • 数据压缩可以使读的数据量更少,在IO密集型计算中获得大的性能优势
  • 相同类型压缩效率更高
  • 排序之后压缩效率更高
  • 可以针对不同类型使用不同的压缩算法
  • 几种常见的压缩算法

压缩算法

LZ4

输入:abcde_bcdefgh_abcdefghxxxxxxx
​
输出:abcde_(5,4)fgh_(14,5)fghxxxxxxx

(5,4) 代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复

重复项越多或者越长,压缩率就会越高

Run-length encoding

输入:WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW
​
输出:12W1B12W3B24W1B14W

压缩重复的数据

Delta encoding

输入:105, 135, 112, 135, 143, 147
​
输出:105(base),30, -23, 23, 8, 4

将数据存储为连续数据之间的差异,而不是直接存储数据本身

数据选择

1.可以选择特定的列做计算而不是读所有列 2.对聚合计算友好

延迟物化

  • 物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,Join
  • 延迟物化:尽可能推迟物化操作的发生

    • 缓存友好
    • CPU / 内存带宽友好
    • 可以利用到执行计划和算子的优化,例如filter
    • 保留直接在压缩列做计算的机会

向量化

  • SIMD(single instruction multiple data) 对于现代多核CPU,其都有能力用一条指令执行多条数据
  • 执行模型 数据需要按批读取 函数的调用需要明确数据类型
  • 列存数据库适合设计出这样的执行模型,从而使用向量化技术

列存和行存比较.png

ClickHouse的存储设计

ClickHouse的架构

表分区(Partition)概念

表中的数据可以按照指定的字段分区存储,每个分区在文件系统中都是都以目录的形式存在。常用时间字段作为分区字段,数据量大的表可以按照小时分区,数据量小的表可以在按照天分区或者月分区,查询时,使用分区字段作为Where条件,可以有效的过滤掉大量非结果集数据。

ClickHouse 分区的目的是为了尽可能地减少读取的数据量,那么它有哪些特点呢?

  • 创建分区的方法比较简单,只需要在建表时通过partition by语法指定即可;
  • 不止可以按某个字段做partition by,还可以支持按任意合法的表达式进行分区操作,比如toYYYYMM()按月做分区;
  • 支持对partition进行TTL管理,淘汰过期的分区数据;
  • 插入数据到分区表中时,先会将数据写入到分区目录下的segment文件中,后台程序会自动进行合并,当然也可以通过optimize命令手动触发合并。

分片(Shard)概念

一个分片本身就是ClickHouse一个实例节点,分片的本质就是为了提高查询效率,将一份全量的数据分成多份(片),从而降低单节点的数据扫描数量,提高查询性能。

Reference

[1] ClickHouse中分区(Partition)和分片(Shard)概念入门 - 腾讯云开发者社区-腾讯云 (tencent.com)

[2] 【后端专场 学习资料七】第五届字节跳动青训营 - 掘金 (juejin.cn)