clickhouse数据存储原理浅析

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

本文更好的阅读体验在笔者的个人博客

引言

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

简介

        首先要清楚一点,clickhouse是列式存储,列式存储一般来说更适合OLAP场景,查询分析性能上是要比行式存储要快的,为什么呢?这里简单的说一下吧…

  1. 我们都知道数据库里数据存储是按页来的,行式存储和列式存储顾名思义就是一个按照一行一行来存,一个按照一列一列来存,对比如下图所示:

            然后你想啊,你做查询分析的时候总不是把所有的列都一股脑的取出来吧?这些列都放在一起,你要拿到内存中的页也少了,寻址次数也少了,效率自然就上去了不是~
  2. 因为我们一列数据的数据类型是相同的,所以放在一起存储的时候就更方便做数据的压缩,这样我们在传输数据的时候网络时间也可以节约很多,所以也可以说是一方面的优势

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建表一样对吧,这里需要注意几个地方:

  1. 在clickhouse中建表需要设定表引擎,clickhouse设定了合并数、外部存储、内存、文件、接口和其他6大类20多种表引擎,总有一种适合你
  2. clickhouse中设定默认值有这么几种关键字DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS,其中最常用的就是DEFAULT。[在数据写入的时候只有DEFAULT类型的字段可以出现在INSERT中,在数据查询时只有DEFAULT类型的字段可以通过SELECT*选择,在数据存储时只有DEFAULT和MATERIALIZED类型的字段可以持久化]{.red}

合并树家族(MergeTree)


        在生产环境中大多数都是使用的MergeTree表引擎家族:

  • 只有合并树系列的表引擎才支持主键索引、数据分区、数据副本和数据采样等特性
  • 只有此系列的表引擎支持ALTER相关操作
    然后我们就以MergeTree为例讲一下clickhouse存储那些事儿~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值