这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天。
📜📜📜今天学习的是ClickHouse——第一部分。
一、数据库基本概念🌠🌠🌠
数据库是结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。通常由数据库管理系统(DBMS)来控制。在现实中,数据、DBMS及关联应用一起被称为数据库系统,通常简称为数据库。
- 数据库的类型
- 关系数据库——非关系数据库(是否有固定的表结构
- 单机数据库——分布式数据库(是否在一台计算机上部署
- OLTP数据库——OLAP数据库(OLTP (Online transactional processing)数据库是一种高速分析数据库,多个用户执行大量事务; OLAP (Online analytical processing)数据库旨在同时分析多个数据维度。
这里重点看一下OLAP数据库。
大量读写,PB级存储——优化读写效率,查询速度
多维分析,负责的聚合函数
- 窗口函数,自定义UDP(user Define Function)
- 离线/实时分析
SQL的优点:标准化 | 高度非过程化 | 以一种语法结构提供两种使用方式,用户可以在终端上直接输入sql命令对数据库进行操作 | 语言简单易学
数据库框架:
复习一下,parser——parser是语法解析器,将sql语句翻译成一个语法树;
optimizer——optimizer是优化器,将生成的语法树生成sql语句该如何执行。
📢相比较上次的图,今天图中出现了一个Analyer——变量绑定、类型推导、语义检查、安全、权限检查、完整性检查等,为生成计划做准备。
executor——将执行计划翻译成可执行的物理计划并驱动其执行
今天重点学习存储引擎。
- 管理内存数据结构——索引 | 内存数据 | 缓存( Query cache、Data cache、Index cache);
- 管理磁盘数据——磁盘数据的文件格式 | 磁盘数据的增删查改;
- 读写算子——数据写入逻辑 | 数据读取逻辑。
思考一些问题💡
二、列式存储
1、什么是行式存储/列式存储
行式存储:按照每一行的顺序,连续的写到存储介质;
如图:
列式存储:先按照第一列做连续的写入,再第二列……
如图:
2、列式存储的优点
2.1 关于数据压缩——数据压缩可以使读的数据量更少,在IO密集型计算中获得更大的性能优势 | 相同类型压缩效率更高 | 排序之后压缩效率更高 | 可以针对不同类型使用不同的压缩算法。
- 压缩算法举例
LZ4压缩算法:
- (5,4)代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复
- 重复项越多或者越长,压缩率就会越高
Run-length encoding算法(数字代表重复的次数):
- 压缩重复的数据
- 可以再压缩数据上直接计算
Delta encoding算法 :
- 将数据存储为连续数据之间的差异,而不是直接存储数据本身
- 特定算子也能直接在压缩数据上计算
2.2 数据选择
- 可以选择特定的列做计算而不是读所有行
- 对聚合计算友好
2.3 更方便做延迟物化
物化:简单理解就是把数据从一种格式变成另一种格式(将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,Join。
延迟物化:尽可能推迟物化操作的发生。下图是做延时物化和不做延时物化情况:
延时物化的好处:
- 缓存友好
- CPU/内存带宽友好
- 可以利用到执行计划和算子的优化,例如filter
- 保留直接在压缩列做计算的机会
2.4列式存储更容易向量化
什么是向量化?——SIMD (single instruction multiple data),对于现代多核CPU,其都有能力用一条指令执行多条数据。如果这时候CPU也可以并行的计算我们写的代码,那么理论上我们的处理速度就会是之前代码的100倍,SIMD指令就可以完成这样的工作,用SIMD指令完成的代码设计和执行的逻辑就叫做向量化。
向量化的数据有格式和执行模板的要求:
列存数据库适合设计出这样的执行模型,从而使用向量化技术:
- 按列读取
- 每种列类型定义数据读写逻辑
- 函数按列类型处理
代码展示: