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

209 阅读4分钟

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

主要内容

本节课程主要回顾了数据库、sql的概念,然后学习了列存的概念以及优缺点,之后学习了ClickHouse的原理以及典型应用场景。

具体内容

数据库的相关概念

数据库

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

数据库可以分为关系型数据库和非关系型数据库。从架构角度,可以分为单机数据库和分布式数据库,从使用场景,可以分为OLTP和OLAP数据库。其中TP是处理大量的事务,AP要分析大量的数据。这节课的重点是AP数据库。AP的使用场景是多维分析,大量数据的读写,PB级别的存储。

SQL

SQL的结构:老师给出的图感觉挺好的。可以清楚的看出SQL的结构。

SQL优点:SQL是一门标准的语言,其次它是高度非过程化的,用户只需要说明做什么, 不必指明怎么做。可以作为一门嵌入式语言,语言简洁,易学易用。
学习了SQL的执行过程。

列式存储的相关概念

列式存储的优点:进行了数据压缩,可以使读的数据量更少,在IO密集型计算中获得大的性能优势,相同类型压缩效率更高。数据选择上可以选择特定的列做计算,而不是处理所有的列,对聚类计算更好。更适合做延迟物化。物化:把一种数据格式转换成另一种数据格式。 对缓存、CPU、内存带宽更友好,

压缩算法

学习了几种压缩算法,包括LZ4,Run-length encoding,Delta encoding。
LZ4:

输入:abcde_bcdefgh_abcdefghxxxxxxx

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

Run-length encoding: 压缩重复的数据

输入:WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW
输出:12W1B12W3B24W1B14W

Delta encoding: 主要是存储连续数据之间的差异。

向量化:SIMD(single instruction multiple data),对于现代多核CPU,其都有能力用一条指令执行多条数据

使用列式存储对数据格式和执行模型都有相应的要求。其中数据格式要明确类型,执行模型要求数据要按批读取,且函数的调用需要明确数据类型。

之后学习了行存和列存的优缺点以及应用场景。行存储适合点查询(基于索引的简单查询)和增删改较多的场景,列存适合统计分析类查询以及即时查询。

ClickHouse

该部分主要学习了ClickHouse的底层原理。包括表定义和结构、集群架构、引擎架构、存储架构等。

然后学习了Hash索引、B-Tree索引和B+Tree索引的结构以及优缺点。B+Tree的所有数据都存储在叶子节点,且叶子节点维护到相邻子节点的引用。
ClickHouse由于数据量太大,用B-Tree和B+ree都会导致树的深度太高。因此ClickHouse使用LSM tree,其着重优化顺序写入,主要数据结构是SSTable和Memtable。SSTable是顺序写入的,Memtable是在内存中,大部分的实现都是一棵二叉搜索树。
使用稀疏矩阵加速查询,且每个列都有丰富的压缩算法和索引结构。

查询优化方案有:一张表2.建一个物化视图3.使用Projection

数据合并:数据合并是将多个part合并成一起的过程。

典型应用场景

大宽表存储和查询 在查询时可以建非常多的列,可以增加、删除、清空每一列的数据,动态表结构 对离线数据分析上,将数据按列导入。基于列存构建了bitmap这个数据结构。

总结

经过这节课的学习,我学习了列存的概念,列存、Clickhouse的底层原理,了解了hash index、B-Tree、B+tree等结构,并且学习了Clickhouse的典型应用场景。