这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
前天课上讲的ClickHouse就是本次青训营的最后一节课。现在重新看一遍课程内容,做一个笔记复习一下这堂课上学的内容。
数据库的定义在之前的课程中已经提过很多次:数据库是结构化信息或数据的有序集合,由数据库管理系统(DBMS)来控制。数据库一般分为关系型数据库和非关系型数据库,但也能分为OLTP(Online Transactional Processing)数据库和OLAP(Online Analytical Processing)数据库,分别用于高速分析大量事务和分析多维数据。而在OLAP数据库中,往往会涉及到大量数据读写和PB级存储、多维分析和复杂的复合函数,而一般查询都是查询行,在这种场景下效率较低,可以引入列式存储。
列式存储与行存相比,查询时只需要读取涉及到的列,方便投影操作 、物化(将列数据转换为可以被计算或输出的行数据/内存数据结果的过程)、向量化计算,而且压缩效率更高,在OLAP数据库中更加适用。
ClickHouse是一款来自俄罗斯的开源OLAP数据库。在使用时分布式表,不存储数据,用来路由查询,而本地表用来实际存储。存储时将数据分片,每个column存储在part文件夹下。一个part有一个主键索引,每个column都有列索引。索引使用LSM-Tree实现,适用于大吞吐写入场景。每个列都有mark文件,保存最小数据读取单元granules的物理地址,mark文件每一行保存block_offset和granule_offset,分别定位granule在压缩文件和解压后文件的位置。查询时首先通过主键找到需要读的mark,切分mark并发调度reader,reader通过mark内容得到偏移量,然后构建列式filter做数据过滤。
ClickHouse的典型应用场景包括大宽表存储与查询、离线数据分析、复杂类型查询等。