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

116 阅读5分钟
  • 这是我参与「第五届青训营 」伴学笔记创作活动的第 18 天

1. 数据库基本概念

数据库是结构化信息或数据的有序集合。通常由数据库管理系统(DBMS)来控制。再现实中,数据、DBMS及关联应用一起被称为数据库系统,通常简称为数据库。

1.1 数据库类型

  • 关系型数据库:

    关系型数据库就是把数据以表的形式进行储存,然后在各表之间建立关系,通过这些表之间的关系来操作不同表之间的数据。

  • 非关系型数据库:

    NoSQL或非关系数据库,支持存储和操作非结构化及半结构化数据。相比于关系型数据库,NoSQL没有固定的表结构,且数据之间不存在表与表之间的关系,数据之间可以是独立的。

  • 单机数据库:

    在一台计算机上完成数据的存储和查询的数据库系统。

  • 分布式数据库:

    分布式数据库由位于不同站点的两个及以上文件组成。数据库可以存储在对台机器上,位于同一个物理位置,或分散在不同的网络上。

  • OLTP数据库:

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

  • OLAP数据库:

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

1.2 OLAP数据库

  • 大量数据读写,PB级别的存储
  • 多维分析,复杂的聚合函数
  • 窗口函数,自定义UDF(User Define Function)
  • 离线/实时分析

SQL的执行

  • Parser:词法分析,语法分析,生成AST树(Abstract syntax tree)
  • Analyzer:变量绑定、类型推导、语义检查、安全、权限检查、完整性检查等,为生成计划做准备
  • Optimizer:为查询生成性能最优的执行计划,进行代价评估
  • Executor:将执行计划翻译成可执行的物理计划并驱动其执行

存储引擎

  1. 管理内存数据结构

    • 索引
    • 内存数据
    • 缓存
  2. 管理磁盘数据

    • 磁盘数据的文件格式
    • 磁盘数据的增删改查
  3. 读写算子

    • 数据写入逻辑
    • 数据读取逻辑

2. 列式存储

2.1 列式存储的优点

数据压缩

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

数据选择

  • 可以选择特定的列作计算而不是读所有列
  • 对聚合计算友好

延迟物化

  • 尽可能推迟物化操作的发生

物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来作数据过滤,聚合计算,Join。

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

向量化

  • SIMD

    • SIMD(single instruction multiple data),对于现代多核CPU,其都有能力用一条指令执行多条数据
    • 用SIMD指令完成的代码设计和执行的逻辑叫做向量化
  • 数据格式

    • 数据格式要求:

      • 需要处理多个数据,因此数据需要是连续内存
      • 需要明确数据类型
  • 执行模型

    • 执行模型要求

      • 数据需要按批读取
      • 函数的调用需要明确数据类型

列存储数据库适合设计出这样的执行模型,从而是由向量化技术:

  • 按列读取
  • 每种列类型定义数据读写逻辑
  • 函数按列类型1处理

行存VS列存

行存列存
优点数据被保存在一起。INSERT/UPDATE容易。* 查询时只有涉及到的列会被读取。 * 投影(Projection)很高效。 * 任何列都能作为索引 * 便于作延迟物化和向量化计算 * 压缩效率高,每一列可以使用不同的压缩算法
缺点选择(Selection)时即使只涉及某几个列,所有数据也都会被读取。* 选择完成时,被选择的列要重新组装 * INSERT/UPDATE比较麻烦 * 点查询不适合
适用场景* 点查询(返回记录少,基于索引的简单查询)。 * 增、删、改操作较多的场景* 统计分析类查询(OLAP,比如数据仓库业务,此类型的表上会左大量的汇聚运算,且涉及的列操作较少,关联,分组操作较多) * 及时查询(查询条件不确定,行存表扫描难以使用索引)

3. ClickHouse存储设计

3.1 表定义和结构

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

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

  • part和partition

    • part是物理文件夹的名字
    • partition是逻辑结构
  • part和column

    • 每个column都是一个文件
    • 所有的column文件都在自己的part文件夹下
  • column和index

    • 一个part有一个主键索引
    • 每个column都有列索引

3.2 索引设计

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

  • 着重优化顺序写入

  • 主要数据结构

    1. SSTables
    2. Memtable