ClickHouse|青训营笔记

99 阅读4分钟

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

ClickHouse

数据库:结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。通常由数据库管理系统(DBMS)来控制。

数据库系统:数据、数据库管理系统、关联应用一起被称为数据库系统,简称为数据库。

SQL:一种编程语言,用来查询、操作、定义数据,进行数据访问。

SQL的优点:标准化、高度非过程化、以同一种语法架构提供两种使用方式、语言简洁易学。

缓存构成:Query cache、Data cache、Index cache。

行式存储:传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在。

列式存储:列式存储(Column-based)是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。

列式存储优点:数据压缩、延迟物化、向量化。

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

压缩算法:Run-length encoding、LZ4。

物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程。

延迟物化:尽可能推迟物化操作的发生。

延迟物化的好处:缓存友好、CPU/内存带宽友好、可以利用到执行计划和算子的优化、保留直接在压缩列做计算的机会。

SIMD:单指令多数据,用一条指令执行多条数据。

SIMD程序使用的指令集:SSE和AVX系列。

向量化:使用SIMD指令完成的代码设计和执行的逻辑就叫做向量化。

向量化对数据格式的要求:需要处理多个数据,需要连续内存,需要明确的数据类型。

向量化对执行模型的要求:数据按批读取、函数的调用需要明确数据类型。

列存储对向量化的好处:按列直接读取、每种列类型定义数据读写逻辑、函数按列类型处理。

列存投影很高效。

列存的缺点:选择完成时,被选择的列要重新组装,点查询不合适,INSERT/UPDATE比较麻烦。

列存适用场景:统计分析类查询、即时查询。

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

本地表:实际存储数据的表。

cluster:逻辑集群,由多个节点组成。

shard_key:直到数据写入分布式表时的分布方式。

MergeTree引擎是最高效的引擎。

集群架构

引擎架构

存储架构

part:物理文件夹的名称。

Partition:逻辑结构。

B-树:数据写入是有序的,支持增删查改,每个节点有多个孩子节点,每个节点都按照升序排列key值,每个key有两个指向左右孩子节点的引用。

B+树:所有的数据都存储在叶子节点,非叶子节点只保存key值,叶子节点维护到相邻叶子节点的引用,可以通过key值做二分查找,也可以通过叶子节点做顺序访问。

Log-structured merge-tree:一种为大吞吐写入场景的存储结构。

segment:Key按顺序存储到文件中称为segment。

SSTables:包含多个segment,每个segment写入磁盘都是不可更改的,新加的数据只能生成新的segment。

Memtable:在内存中的数据保存在memtable种,大多数实现都是一颗Binary search tree,当memtable存储的数据到达一定的阈值的时候,就会按顺序写入到磁盘。

数据按照key顺序做排序的缺点:第一个key的过滤效果好,后面的过滤效果依赖于第一个key的基数大小。

secondary index:在URL列上构建二级索引。

物化视图:可以通过select查询将一个表的数据写入一张表。

Projection:类似于物化视图,但是不是将数据写入新的表,而是存储在原始表种,以一个列文件的形式存在。