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

72 阅读5分钟

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

1.主要内容

  1. 数据库基本概念
  2. 列式存储
  3. ClickHouse存储设计
  4. ClickHouse应用场景

2.本节详细内容

数据库基本概念

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

数据库的类型

  • 关系型数据库: 关系型数据库是把数据以表的形式进行存储,然后各个表之间建立关系,通过这些表之间的关系来操作不同表之间的数据
  • 非关系型数据库:NoSQL或非关系数据库,支持存储和操作非结构化及半结构化数据。相比于关系型数据库,NoSQL没有固定的表结构,而且数据之间不存在表与表之间的关系,数据之间是可以独立的
  • 单机数据库:在一台计算机上完成数据的存储和查询的数据库系统
  • 分布式数据库:分布式数据库由多个站点的两个或者多个文件组成。数据库可以存储在多台计算机上,位于同一个物理位置,或者分散在不同的网络上

OLTP(On-line Transaction Processing,联机事务处理)数据库

OLTP 或联机事务处理是一种数据处理类型,包括执行多个并发的事务,例如网上银行、购物、订单输入或发送文本消息。这些事务传统上被称为经济或财务事务,会被记录并加以保护,帮助企业随时访问这些信息,以用于会计或报告目的。

OLAP(On-line Analytical Processing,联机分析处理)数据库

旨在同时分析多个数据维度,帮助团队更好地理解其数据中的复杂关系

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

OLAP和OLTP对比

image.png

SQL

一种编程语言,目前几乎所有的关系型数据库都使用SQL编程语言来查询、操作和定义数据,进行数据访问控制

  • FROM子句指定了选择的数据表。FROM子句也可以包含JOIN 二层子句来为数据表的连接设置规则。
  • WHERE子句后接一个比较谓词以限制返回的行。WHERE子句仅保留返回结果里使得比较谓词的值为True的行。
  • GROUP BY子句用于将若干含有相同值的行合并。 GROUP BY通常与SQL聚合函数连用,或者用于清除数据重复的行。GROUP BY子句要用在WHERE子句之后。
  • HAVING子句后接一个谓词来过滤从GROUP BY子句中获得的结果,由于其作用于GROUP BY子句之上,所以聚合函数也可以放到其谓词中。
  • ORDER BY子句指明将哪个字段用作排序关键字,以及排序顺序(升序/降序),如果无此子句,那么返回结果的顺序不能保证有序

SQL的用途

  • 定义数据模型
  • 读写数据库数据

SQL的优点

  1. 标准化
  2. 高度非过程化 :只需提出做什么,不必指明怎么做。大大减轻用户负担,而且有利于提高数据独立性
  3. 可嵌入性 :可以嵌入到高级语言中,语法基本一致
  4. 语言简洁,易学易用 :语法简单,接近口语

SQL执行

列式存储

image.png

优点

数据压缩

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

几种常见的压缩算法

  • LZ4
  • Run-length encoding
  • Delta encoding

数据处理

查询优化

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

延迟物化

  • 物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,Join
  • 延迟物化:尽可能推迟物化操作的发生
  • 缓存友好
  • CPU / 内存带宽友好
  • 可以利用到执行计划和算子的优化,例如filter
  • 保留直接在压缩列做计算的机会

向量化

  • SIMD
  • 执行模型 : 数据需要按批读取 函数的调用需要明确数据类型
  • 列存数据库适合设计出这样的执行模型,从而使用向量化技术

行存和列存

image.png

ClickHouse的存储设计

架构

  1. 整体架构 image.png
  2. 表定义和结构 image.png
  3. 集群架构

image.png

3.应用场景

  • 大宽表存储和查询
  • 离线数据分析
  • 实时数据分析
  • 复杂类型查询

4.课后总结

  • 列存储和日常使用的行存储完全不同
  • 实现原理是重点难点
  • 列存储的使用场景

5.引用

字节直播课:ClickHouse - 你没有见过的列存储

稀土掘金-后端学习资料