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

57 阅读4分钟

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

数据库基本概念

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

数据库类型

关系型数据库,关系型数据库是把数据以表的形式进行存储,然后再各个表之间建立关系,通过这些表之间的关系来操作不同表之间的数据。

非关系型数据库,nosql或非关系型数据库,支持存储和操作非结构化及半结构化数据。相比于关系型数据库,nosql没有固定的表结构,且数据之间不存在表与表之间的关系,数据之间可以是独立的。

单机数据库:在一台计算机上完成数据的存储和查询的数据库系统 或多个 分布式数据库,分布式数据库由位于不同站点的两个文件组成。数据库可以存储在多台计算机上,位于同一个物理位置,或分散在不同的网络中

Oltp数据库是一种高速分析数据库,专为多个用户执行大量事务而设计;olap数据库旨在同时分析多个数据维度,帮助团队更好地理解其数据中的复制关系

olap数据库

olap数据库能够支持,大数据的读写,pb级别的存储,支持多维分析,复杂的聚合函数,窗口函数,自定义UDF,离线/实时分析。

SQL

一个简单的SQL查询包含SELECT关键词,星号也可以用来查询包含SELECT关键词;标准化,ISO和ANSI是长期建立使用的SQL数据库标准;高度非过程化,用SQL进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”;以同一种语法结构提供两种使用方式;语言简洁,易学易用

数据库架构

image.png

列式存储

数据压缩:数据压缩可以使读的数据量更少,在IO密集型计算中获得更大的性能优势,相同类型压缩效率更高,排序之后压缩效率更高,可以针对不同类型使用不同的压缩算法,由LZ4压缩算法,Run-length encoding,delta encoding,将数据存储为连续数据之间的差异,而不是直接存储数据本身。特定算子也能直接在压缩数据上计算

数据选择:可以选择特定的列做计算而不是读所有列,对聚合计算友好。

延迟物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据可以用来做数据过滤,聚合计算和join,对缓存友好,cpu/内存带宽友好,可以利用到执行计划和算子的优化,例如filter,保留直接在压缩列做计算的机会。

向量化:SIMD,cpu利用其机制用一条指令执行多条数据,由数据格式要求,需要连续内存和明确数据类型

image.png

clickhouse存储设计

表定义与结构

image.png

集群架构

image.png

引擎架构

image.png

存储架构

image.png part和partition,part是物理文件夹的名字,partition是逻辑结构 part和column,每个column都是一个文件,所有的column文件都在自己的part文件夹下,column和index,一个part有一个主键索引,每个column都有列索引

LSM-Tree

主要数据结构,SSTables和Memtable。SSTables,Key按顺序存储到文件中,称为segment,每个SSTables包含多个segment,每个segment写入磁盘后都是不可更改的,新加的数据只能生成新的segment。Mentable,在内存中的数据保存在memtable中,大多数是二叉搜索树。当memtable存储的数据到达一定阈值时,就会按顺序写入磁盘。

数据查询

需要从最新的segment开始遍历每一个key,也可以为每个segment构建一个索引。Compaction操作指将多个segments合并成一个segments的过程,不同的segments写入新的segment的时候也是需要排序形成新的segment之后,旧的segment文件就会被删除

查询优化

主键包含的数据顺序写入,主键构造一个主键索引,每个列构建一个稀疏索引,通过mark的选择让主键索引可以定位到每一列的索引,可以通过多种手段优化非主键列的索引

clickhouse应用场景

大宽表存储和查询,可以建非常多的列,可以增加,删除,情况每一列的数据,查询时候引擎可以快速选择需要的列,可以将涉及到的过滤条件下推到存储层,从而加速查询。