本文更好的阅读体验在笔者的个人博客中
引言
最近做项目有个需求,想对clickhouse中的数据添加几个标签,但是总记着之前草草看过说clickhouse这种OLAP引擎的更新和删除数据操作是灾难性的,所以决定看看clickhouse的存储原理,然后再斟酌一下技术方案吧~

简介
首先要清楚一点,clickhouse是列式存储,列式存储一般来说更适合OLAP场景,查询分析性能上是要比行式存储要快的,为什么呢?这里简单的说一下吧…
- 我们都知道数据库里数据存储是按页来的,行式存储和列式存储顾名思义就是一个按照一行一行来存,一个按照一列一列来存,对比如下图所示:

然后你想啊,你做查询分析的时候总不是把所有的列都一股脑的取出来吧?这些列都放在一起,你要拿到内存中的页也少了,寻址次数也少了,效率自然就上去了不是~ - 因为我们一列数据的数据类型是相同的,所以放在一起存储的时候就更方便做数据的压缩,这样我们在传输数据的时候网络时间也可以节约很多,所以也可以说是一方面的优势
clickhouse表引擎与建表
首先先来看一下clickhouse中的建表语句:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1],
name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2],
...
) ENGINE = engine
基本上和MySQL建表一样对吧,这里需要注意几个地方:
- 在clickhouse中建表需要设定表引擎,clickhouse设定了合并数、外部存储、内存、文件、接口和其他6大类20多种表引擎,总有一种适合你
- clickhouse中设定默认值有这么几种关键字
DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS,其中最常用的就是DEFAULT。[在数据写入的时候只有DEFAULT类型的字段可以出现在INSERT中,在数据查询时只有DEFAULT类型的字段可以通过SELECT*选择,在数据存储时只有DEFAULT和MATERIALIZED类型的字段可以持久化]{.red}
合并树家族(MergeTree)

在生产环境中大多数都是使用的MergeTree表引擎家族:
- 只有合并树系列的表引擎才支持主键索引、数据分区、数据副本和数据采样等特性
- 只有此系列的表引擎支持ALTER相关操作
然后我们就以MergeTree为例讲一下clickhouse存储那些事儿~

本文详细介绍了ClickHouse的存储原理,特别是MergeTree表引擎的工作机制,包括列式存储的优势、建表语法、数据分区、主键与索引、数据文件结构等。重点讨论了MergeTree的存储结构,如一级索引、数据文件、标记文件和压缩数据块,以及数据写入和查询过程。通过对数据存储流程的梳理,揭示了ClickHouse如何实现高效的OLAP查询。

被折叠的 条评论
为什么被折叠?



