MergeTree写入查询流程分析

news2024/11/19 16:45:02

基础概念回顾

前面几节我们分别详细分析了分区,索引,数据存储相关原理,这些组件配合在一起给Clickhouse数据库带来非常高效的查询性能。前面的文章也单独介绍了这几个组件。接下来,就分别从写入过程、查询过程,以及数据标记与压缩数据块的三种对应关系的角度展开介绍,我们首先回顾一下这些概念:

  1. 分区: 在MergeTree中,数据是以分区目录的形式进行组织的,每个分区独立分开存储,借助这种形式,数据查询时可以有效跳过无用的数据文件,只使用最小的分区目录子集;
  2. 一级索引使用二进制格式存储,用于存储稀疏索引,一张 MergeTree 表只能通过 ORDER BY 或 PRIMARY KEY声明一次一级索引。借助稀疏索引,在查询数据时能够排除主键条件范围之外的数据文件,从而有效减少数据扫描范围,加速查询速度;
  3. 二级索引又称为跳数索引,由数据的聚合信息构建而成,根据索引类型的不同,其聚合信息的内容也不同,跳数索引的目的与一级索引一样,也是帮助查询时减少数据扫描的范围;
  4. 数据bin文件是由1至多个压缩数据块组成的,每个压缩块大小在64KB~1MB之间,多个压缩数据块之间,按照写入顺序首尾相接,紧密地排列在一起;
  5. 数据标记使用二进制格式存储,标记文件中保存了 data.bin 文件中数据的偏移量信息,并且标记文件与稀疏索引对齐,因此 MergeTree 通过标记文件建立了稀疏索引(primary.idx)与数据文件(data.bin)之间的映射关系。而在读取数据的时候,首先会通过稀疏索引(primary.idx)找到对应数据的偏移量信息(data.mrk),因为两者是对齐的,然后再根据偏移量信息直接从 data.bin 文件中读取数据。

写入&查询流程分析

写入流程

  1. 数据写入的第一步是生成分区目录,伴随着每一批数据的写入,都会生成一个新的分区目录,在后续的某一时刻,属于相同分区的分区目录会被合并到一起;
  2. 按照index_granularity索引粒度,会分别生成 primary.idx 一级索引(如果声明了二级索引,还会创建二级索引文件);
  3. 按照index_granularity索引粒度,生成每一个列字段的压缩数据文件(.bin)和数据标记文件(.mrk),如果数据量不大,则是 data.bin 和 data.mrk 文件。

下图所示是一张MergeTree表在写入数据时,它的分区目录、索引、标记和压缩数据的生成过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LL7RvgZ7-1672192978184)(/Users/lidongmeng/Library/Application Support/typora-user-images/image-20221227190119500.png)]

从分区目录 202006_1_34_3 能够得知,该分区数据总共分 34 批写入,期间发生过 3 次合并。在数据写入的过程中,依据 index_granularity 的粒度,依次为每个区间的数据生成索引、标记和压缩数据块。其中索引和标记区间是对齐的,而标记与压缩块则是根据区间大小的不同,会生成多对一、一对一、一对多的关系。

查询流程

数据查询的本质,可以看作一个不断减小数据范围的过程。在最理想的情况下,MergeTree 首先可以依次借助分区索引、一级索引和二级索引,将数据 扫描范围缩至最小。然后再借助数据标记,将需要解压与计算的数据范围缩至最小。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFCl96q4-1672192978185)(/Users/lidongmeng/Library/Application Support/typora-user-images/image-20221227190143652.png)]

如果一条查询语句没有指定任何 WHERE 条件,或者指定了 WHERE 条件、但是没有匹配到任何的索引(分区索引、一级索引、二级索引),那么 MergeTree 就不能预先减少数据范围。在后续进行数据查询时,它会扫描所有分区目录,以及目录内索引段的最大区间。不过虽然不能减少数据范围,但 MergeTree 仍然能够借助数据标记,以多线程的形式同时读取多个压缩数据块,以提升性能。

参考

  1. https://www.cnblogs.com/traditional/p/15218743.html
  2. https://mp.weixin.qq.com/s/VTTYMdY5A2SZNQdkZoXuhw
  3. Clickhouse原理解析与应用实践 朱凯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字孪生水电站,三维组态助力发电流程优化

从大禹治水到三峡大坝的建造,人类为控制和调配自然界的地表水和地下水,修建了许多的水利工程。对水资源进行了广泛的开发利用,诸如农业灌溉、工业和生活用水、水力发电、航运、港口运输、淡水养殖、旅游等。 将图扑软件与 GIS、粒子仿真、虚拟…

在re:Invent 2022大会打球、喝酒?没错!

编辑|阿冒虽然距离去拉斯维加斯参加亚马逊云科技re:Invent 2022大会,差不多已经过去了一个月,不过时不时仍有熟稔的朋友来问我,你在展区球场上如何如何,巴拉巴拉……为啥他们对我的行动如此了解?其实&#…

effective C++读书笔记

目录 用const,enum,inline去替换#define 尽可能去使用const 确保对象使用前已被初始化 这是effective C中的第一大章节:让自己习惯c 用const,enum,inline去替换#define 当用使用这样的代码: #define ASPECT RATIO 1.653 记号名称ASPECT RATIO可能未…

图像风格迁移---基于多适应网络的任意风格传输

ABSTRACT 任意风格转换是一个具有研究价值和应用前景的重要课题。给定一个内容图像和引用的风格绘画,一个所需的风格转换将使用风格绘画的色彩色调和生动的笔画模式渲染内容图像,同时保持详细的内容结构信息。风格迁移方法首先学习内容和内容和风格引用…

推荐系统的矩阵分解

0 序言 推荐系统中基于内容的协调过滤算法通过用户之间的相似性或者物品之间的相似性,通过相似性来为用户做决策和推荐;基于内容的协调过滤算法在实际生产环境中,User或Item的数据量非常大(百万级别),存储…

操作系统期末考试必会题库3——处理机调度

1、假设一个系统中有5个进程,它们处于就绪状态的时刻和估计运行时间如下表所示,忽略I/O以及其它开销时间,若分别按先来先服务,最短进程优先,最短剩余时间优先、响应比优先、时间片轮转(时间片=1…

世界杯 | 其实世界杯结束之前,卡塔尔就开拆体育场了...

大家好,这里又是建模助手。 世界杯已经圆满落幕,梅老板满载而归,但阿根廷与法国的这场世界杯决赛注定载入史册,成为永恒经典,或许将会是世界杯历史上最精彩的决赛之一。 (梅老板捧起大力神杯那一刻&#x…

人工鱼群算法参数寻优及可视化(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 人工鱼群优化算法是一种基于模拟鱼群行为的优化算法,是由李晓磊等在2002年提出的一种新型的寻优算法。人工鱼群主要…

黑马Hive+Spark离线数仓工业项目--数仓事实层DWB层构建(1)

整体目标:构建数仓中的DWB:主题事务事实表 核心的主题事实的构建:SQL实现 主题的指标 原始事务事实数据【DWD】:订单数据 主题事务事实数据【DWB】:订单主题 - 主题周期快照事实表:数据应用层【ST&#…

一场4800亿“锂电”战事,瑞浦兰钧射出三支“价值之箭”

顺势而为,是一家企业成功突围的最佳利器。 如今,几乎所有企业都被“碳达峰碳中和”的国家级战略所影响。在此大势的推动之下,锂离子电池、清洁能源等产业也随之进入高速发展期。工信部数据显示,上半年全国锂离子电池产量超过280G…

HNU编译原理实验二cminus_compiler-2022-fall

前言:个人感觉比第一次的难,借鉴了前辈的报告才勉强看懂在干嘛 lab2实验报告实验要求 本次实验需要先将自己的 lab1 的词法部分复制到 /src/parser 目录的 lexical_analyzer.l并合理修改相应部分,然后根据 cminus-f 的语法补全 syntax_analy…

3.3 直接耦合放大电路

工业控制中的很多物理量均为模拟量,如温度、流量、压力、液面、长度等,它们通过各种不同传感器转化成电量后也均为缓慢变化的非周期性信号,而且比较微弱,因而这类信号一般均需通过直接耦合放大电路后才能驱动负载。 一、直接耦合…

二叉树,红黑树,B树、B+树的区别

树的概念 树的演变 二叉搜索树 二叉搜索树可以提高查询效率,左小右大,但是他不好掌握根节点的数字是哪个,容易一边倒,导致层数变多,降低效率 平衡二叉搜索树 平衡二叉搜索树在二叉搜索树的基础上,通过控制任意一个节…

Shell“语言程序设计基础......“

Shell语言也有设计基础吗?...... 没有所谓的语言程序设计基础往往是一种就是菜鸡互啄的一种状态......哦,据说当年,发明笔记本电脑的人(想出发明笔记本电脑这个创意的人)一开始的工作是写说明书的Linux 或者 Unix 发明的那个年代应该还没有这种充满了营销的或者应试的表述方法…

密码学 密钥管理

密钥管理 出发点:在一种安全策略指导下的密钥产生,存储,分配,删除,归档和应用方案。 目的:维持系统各实体之间的密钥关系,抗击各种威胁: 1.密钥泄露 2.密钥和公钥身份真实性丧失 3…

计算机内存机制精讲

全文目录1、一个程序在计算机中到底是如何运行的?2、虚拟内存到底是什么?虚拟地址中间层思想3、虚拟地址空间以及编译模式CPU的数据处理能力编译模式32位编译模式64位编译模式4、内存对齐,提高寻址效率5、内存分页机制,完成虚拟地…

react-native学习过程记录

1、关于react-native init 创建项目报错 cli.init is not a function 问题解决 直接采用npx react-native init chapter2 --version 0.68.2 创建项目(即指定version) 参考地址:https://blog.csdn.net/qq_42231156/article/details/126396576…

【云原生进阶之容器】第二章Controller Manager原理剖析--2.1节Controller Manager综述

1 K8S Controller Manager原理解析 1.1 Controller Manager作用简述 一般来说,智能系统和自动系统通常会通过一个“操作系统”不断修正系统的工作状态。在Kubernetes集群中,每个Controller都是这样的一个"操作系统",它们通过APIServer 提供的(List-Watch)接口实…

小程序集成Three.js开发常见问题

1.加载模型后开发者工具卡顿 我想很多小伙伴都遇到过这个问题,网上很多方法,说什么清缓存,清内存,基本作用都不大。在不断的摸索中,我逐渐找到了一些解决的办法,希望对你有帮助。 (1) 截至发文时间&#…

Java-集合(1)

什么是集合? 在前面的学习中,保存多个数据,用的是数组。 但是数组有很多不同的地方: 1.长度开始时必须指定,且一旦指定无法更改 2.保存的必须为同一类型元素,虽说可以多态保存,但是限制性也很大…