ClickHouse设计原理简介(下)

简介: ClickHouse设计原理简介(下)

二级索引生成文件

数据分区

![]

image.png

数据是以分区目录的形式进行组织的,每个分区的数据独立分开存储;横向切分是分片;纵向切分是分区。

数据分区合并

image.png

t0时刻,有三批数据写入。

第一批数据是 2021-05-01,因分区键是年-月,则会得到分区目录202105_1_1_0

202105表示年月的分区id,第一个1表示最小的blockNum,第二个1表示最大的blockNum,第一批数据,maxBlockNum=minBlockNum=blockNum=1,最后一个0表示合并的次数,此时还未发生合并所以是level=0

第二批数据是2021-05-02,则会得到202105_2_2_0,因blockNum=2=minBlockNum=maxBlockNum,还未合并所以level是0

第三批数据是2021-06-02,则会得到202105_3_3_0,因blockNum=3=minBlockNum=maxBlockNum,还未合并所以level是0

t1时刻,202105的分区发生合并

202105_1_1_0和202105_2_2_0合并得到202105_1_2_1

分区id不变还是202105

最小blockNum合并结果为1,因为一个是1一个是2,取最小值即为1

最大blockNum合并结果为2,因为一个是1一个是2,取最大值即为2

level结果是1,因为一个是0,另外一个也是0,取两者的最大值再加1即为1

所以合并之后的分区目录为202105_1_2_1

合并之后,老的分区目录则会处于非激活状态,不对外提供服务,默认8分钟之后,异步被清理。

一级索引


image.png

  • • primary.idx文件内的一级索引(主键索引)采用稀疏索引实现
  • • 稀疏索引占用的索引存储空间较小。数据量大的场景可以利用primary.idx内的索引数据常驻内存,加快查询速度
  • • 默认索引粒度大小为8192
  • • 每隔一个索引粒度会取该粒度范围内的第一个主键值作为索引保存到primay.idx文件中

二级索引(跳数索引)

二级索引由数据块按粒度分割后,各部分数据聚合信息构成

image.png

索引a表示:粒度范围内price*size即总价的最小值和最大值

  • • minmax 存储指定表达式的极值
  • • set(max_rows) 存储指定表达式的不重复值,max_rows表示重复值的个数限制,比如max_rows=10表示只有10个不同的值可重复;0表示无限制
  • • ngrambf_v1 存储一个包含数据块中所有ngram的布隆过滤器,用于字符串的equals、like、in过滤。ngram是统计语言模型的算法,用于分词
  • • tokenbf_v1 跟ngrambf_v1类似,但是它不是用ngrams进行分词,而是使用token,token是非字母数字的符号分割的序列比如分号;
  • • bloom_filter 指定列存储的布隆过滤器

数据压缩-- 压缩数据块

image.png

  • • bin压缩文件是由多个压缩数据块组成的,而每个压缩数据块的头信息则会基于CompressionMethod_CompressedSize_uncompressedSize公式生成
  • • 压缩方法包含:LZ4、ZSTD、Multiple、Delta多种算法

数据压缩-- 压缩方式

image.png

  • • 单个间隔数据不超过64KB,则累积到64KB生成下一个压缩块
  • • 单个间隔数据大于64KB,不超过1MB,则直接生成下一个压缩块
  • • 单个间隔数据大于1MB,则直接生成多个压缩快

数据标记

image.png

.mrk标记文件为一级索引和数据文件之间建立关联,主要保存两个信息

  • • 一级索引对应的编号信息
  • • bin压缩数据块的起始偏移量和解压缩块的起始偏移量

每个索引粒度内取第一条重新写入。每个索引值都会有一个下标。第一个索引粒度内,使用第一条数据保存到索引池,下标编号为0,对应start0~start1区间。索引文件中保存了编号信息,通过编号信息找到压缩数据的起始偏移量和解压缩数据的起始偏移量

MergeTree写入的过程

image.png

每一批数据写入到数据目录里去,有三种不同的压缩方式,随着压缩文件的生成也伴随着一级索引和标记文件的构建,最终使得压缩文件、标记、索引一一对应。

MergeTree的读取过程

image.png

通过查询语句的filter过滤条件,根据分区索引找到唯一满足的分区目录,进入到分区目录,会根据一级索引来进行过滤,排除掉不符合的一些索引信息,保留索引2和索引3,然后根据二级索引排除掉索引2,那么就只剩索引3这个一级索引,数据标记能够为一级索引和数据文件进行关联,找到对应的压缩块,然后解压缩,然后根据标记中的起始偏移量找到对应的数据,这就是MergeTree的读取过程。

如果没有过滤条件则会通过多线程的操作对这些分区目录并行的进行读取,加速查询过程。

相关文章
|
存储 SQL 运维
涨姿势 | 一文读懂备受大厂青睐的ClickHouse高性能列存核心原理
本文尝试解读ClickHouse存储层的设计与实现,剖析它的性能奥妙
3321 0
涨姿势 | 一文读懂备受大厂青睐的ClickHouse高性能列存核心原理
|
存储 SQL 设计模式
ClickHouse设计原理简介(中)
ClickHouse设计原理简介(中)
363 1
ClickHouse设计原理简介(中)
|
存储 消息中间件 SQL
Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)
Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)
694 0
Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)
|
存储 SQL 算法
ClickHouse设计原理简介(上)
ClickHouse设计原理简介(上)
526 0
ClickHouse设计原理简介(上)
|
存储 SQL 分布式计算
clickhouse简介
clickhouse简介
579 0
|
20天前
|
存储 关系型数据库 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 多对一和多对多
【6月更文挑战第7天】该文探讨数据模型,比较了“多对一”和“多对多”关系。通过使用ID而不是纯文本(如region_id代替"Greater Seattle Area"),可以实现统一、避免歧义、简化修改、支持本地化及优化搜索。在数据库设计中,需权衡冗余和范式。文档型数据库适合一对多但处理多对多复杂,若无Join,需应用程序处理。关系型数据库则通过外键和JOIN处理这些关系。文章还提及文档模型与70年代层次模型的相似性,层次模型以树形结构限制了多对多关系处理。为克服层次模型局限,发展出了关系模型和网状模型。
24 6
|
22天前
|
XML NoSQL 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 概念 + 数据模型
【6月更文挑战第5天】本文探讨了数据模型的分析,关注点包括数据元素、关系及不同类型的模型(关系、文档、图)与Schema模式。查询语言的考量涉及与数据模型的关联及声明式与命令式编程。数据模型从应用开发者到硬件工程师的各抽象层次中起着简化复杂性的关键作用,理想模型应具备简洁直观和可组合性。
15 2
|
19天前
|
SQL 人工智能 关系型数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 文档模型中Schema的灵活性
【6月更文挑战第8天】网状模型是层次模型的扩展,允许节点有多重父节点,但导航复杂,需要预知数据库结构。关系模型将数据组织为元组和关系,强调声明式查询,解耦查询语句与执行路径,简化了访问并通过查询优化器提高效率。文档型数据库适合树形结构数据,提供弱模式灵活性,但在Join支持和访问局部性上不如关系型。关系型数据库通过外键和Join处理多对多关系,适合高度关联数据。文档型数据库的模式灵活性体现在schema-on-read,写入时不校验,读取时解析,牺牲性能换取灵活性。适用于不同类型或结构变化的数据场景。
19 0
|
21天前
|
SQL JSON NoSQL
【DDIA笔记】【ch2】 数据模型和查询语言 -- 关系模型与文档模型
【6月更文挑战第6天】关系模型是主流数据库模型,以二维表形式展示数据,支持关系算子。分为事务型、分析型和混合型。尽管有其他模型挑战,如网状和层次模型,但关系模型仍占主导。然而,随着大数据增长和NoSQL的出现(如MongoDB、Redis),强调伸缩性、专业化查询和表达力,关系模型的局限性显现。面向对象编程与SQL的不匹配导致“阻抗不匹配”问题,ORM框架缓解但未完全解决。文档模型(如JSON)提供更自然的嵌套结构,适合表示复杂关系,具备模式灵活性和更好的数据局部性。
20 0
|
23天前
|
敏捷开发 存储 缓存
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- 可维护性
【6月更文挑战第4天】本文探讨了Twitter面临的一次发推文引发的巨大写入压力问题,指出用户粉丝数分布是决定系统扩展性的关键因素。为解决此问题,Twitter采用混合策略,大部分用户推文扇出至粉丝主页时间线,而少数名人推文则单独处理。性能指标包括吞吐量、响应时间和延迟,其中高百分位响应时间对用户体验至关重要。应对负载的方法分为纵向和横向扩展,以及自动和手动调整。文章强调了可维护性的重要性,包括可操作性、简单性和可演化性,以减轻维护负担和适应变化。此外,良好设计应减少复杂性,提供预测性行为,并支持未来改动。
20 0

热门文章

最新文章