Clickhouse 入门到精通-Clickhouse工作原理

news2024/10/2 8:23:38

Clickhouse 为什么做查询分析那么快????????

因为clickhouse使用了下列方案:

  1. clickhouse 数据分区
  2. clickhouse 列式存储
  3. clickhouse 一级索引(主键索引)
  4. clickhouse 二级索引(跳数索引)
  5. clickhouse 数据压缩
  6. clickhouse 数据标记

 结合两个需求场景来解析

  • 数据插入
  • 数据查询

1、clickhouse数据分区

关于表分区目录结构:MergeTree表的分区目录物理结构:

假设有一个分区表:该表有 a,b,date,name四个字段,其中date是分区字段(按月份)

那么对于分区有两个问题:

  • 分区文件夹的命名规则是什么?合并规则是什么?
  • 分区文件夹中国的文件列表,各是什么作用,什么含义?

 1.1命名规则 & 合并规则

PartitionID_MinBlockNum_MaxBlockNum_level,示例:20230519_1_1_0

PartitionID:分区字段的值

MinBlockNum:最小块序号

MaxBlockNum:最大块序号

Level:参与合并的次数

BlockNum是表内部全局累加,每次创建一个新的分区目录,就会累加 1

文件目录的变化过程

-- 假设有两条语句
A: insert into table values ('2021-06', 'a'), ('2021-07', 'b');
B: insert into table values ('2021-06', 'c'), ('2021-07', 'd');

语句执行完成后,就会创建如下文件夹

# 结果体现了blockNum的表内全局累加
A语句 创建文件夹:2021-06_1_1_0, 2021-07_2_2_0
B语句 创建文件夹:2021-06_3_3_0, 2021-07_4_4_0

这里就会有疑问,我两条语句向同一个分区写入数据,创建两个目录岂不是增加了没必要目录数量?且增加了很多小文件?
这其实也是为什么说clickhouse不适合单条或少量数据高频写入了,因为clickhouse是通过分区文件合并来整合目录的!当要整合的目录过多,会极大消耗系统的IO资源。

# 文件目录合并结果
2021-06_1_1_0 + 2021-06_3_3_0 = 2021-06_1_3_1
2021-07_2_2_0 + 2021-07_4_4_0 = 2021-07_2_4_1

 这里再重温一下文件夹命名规则:ParitionID_MinBlockNum_MaxBlockNum_level
通过结果可以很直观的看出,同一个分区多目录合并时,会取最小的blockNum 与 最大的blockNum作为批次号,同时会取 max(level) + 1的方式记录合并次数

各文件的含义

# 文件目录
## 以下是数据列存储的文件,其中bin是数据内容,mrk是标记文件,结合索引标记数据位置
a.bin
a.mrk2
b.bin
b.mrk2
date.bin
date.mrk2
name.bin
name.mrk2

## 以下是系统数据文件
checksums.txt # 校验文件完整性,二进制存储(primary.idx, count.txt)size大小及size哈希值
columns.txt # 列信息
primary.idx # 一级索引,主键索引
minmax_date.idx # 二级索引,分区字段索引
default_compression_codec.txt # 压缩编码
count.txt # 当前分区的数据量

文件目录时序图

 2、列式存储

所有的OLAP技术,基本都是使用的列式存储。其有以下有点:

  • 分析场景中往往需要读取大量行但是少量列。在行存储模式中,所有的列数据存储在一个 block 中,不参与计算的列在IO的时候也需要读取,造成没必要的IO浪费,而列式存储,则只需要读取参与计算的列即可,极大的减少IO消耗,加快检索效率。
  • 同一列数据中的数据类型相同,有利于提高压缩比列,节省大量存储空间,压缩比列高,则意味着数据体积小,对应的其IO读取消耗时间更短。
  • 自由压缩算法选择,不同的列可以根据数据类型,来使用不同的压缩算法
  • 高压缩比,同时也会减少内存消耗,同样的内存可以缓存更多的数据。

注意:列式存储,一般不用于数据删除场景,这是列式存储并不擅长做的事情。

 3、一级索引(主键索引、稀疏索引)

在clickhouse中,主键索引默认 8192 条数据作为一条索引

 关于一级索引:MergeTree的主键使用 Primary Key 定义,待主键定义后,MergeTree 会根据index_granularity间隔(默认8192条),为数据表生成一级索引并保存至 primary.idx文件

 4、二级索引(跳数索引)

clickhouse中二级索引是在一级索引的基础上建立的,有一个重要的参数:

granularity = 3 这个的意思是:在3段一级索引上创建二级索引

 二级索引支持的类型

  • minmax:以index_granularity为单位,存储指定表达式计算后的 min、max值;在等值和范围查询中能够帮助快速跳过不满足要求的块,减少IO
  • set(max_rows):以 index_granularity为单位,存储指定表达式 disinct value集合,用于快速判断等值查询是否命中该块,减少IO
  • ngrambf_v1(n,size_of_bloom_fiter_in_bytes,number_of_hash_functions,random_seed):将string进行ngram分词后,构建bloom filter,能够优化 等值,like,in等查询条件
  • tokenbf_v1(size_of_bloom_fiter_in_bytes,number_of_hash_functions,random_seed):与ngrambf_v1类似,区别是不使用ngram进行分词,而是通过标点符号进行词语分割。
  • bloom_filter([false_positive]):对指定列构建bloom filter ,用于加速 等值,like,in等查询条件执行

 5、数据压缩

关于数据压缩:clickhouse的数据存储文件column.bin 中存储的是一列数据,由于一列是相同的数据类型,所以方便高效压缩,在进行压缩的实时,请注意:一个压缩数据块由头信息和压缩数据两部分组成,头信息固定使用9位字节表示,具体有 1 个 UInt8(1字节)整型和2个UInt32(4字节)整型组成,分别代表使用的压缩算法类型、压缩后的数据大小和压缩前的数据大小。每个压缩数据块的体积,按照其压缩前 max_compress_block_size(默认1MB)参数指定

原理说法:每8192条记录,其实就是一条一级索引,一个索引区间压缩成一个数据块

 具体压缩规则:

1、单个批次数据 size < 64KB:如果单个批次数据小于64KB,则继续获取下一批数据后,只至累计到size >= 64KB时,生成下一个压缩数据块。如果平均每条记录小于8byte,多个数据批次压缩成一个数据块

2、单个批次数据 64KB <= size <= 1MB:如果单个批次数据大小在 64KB与1MB之间,则直接生成下一个压缩数据块

3、单个批次数据 size > 1MB:如果单个批次数据直接超过 1MB ,则首先按照 1MB大小截断并生成下一个压缩数据块。剩余数据继续依照上诉规则执行。此时,会出现一个批次数据生成多个压缩数据块的情况。如果平均每条记录的大小超过 128 byte,则会把当前这一个批次的数据压缩成多个数据块。

 总结:在一个 xxx.bin字段存储文件中,并不是一个压缩块对应到一条一级索引,而是每8192条数据,构建一条一级索引;

总结:一个column.bin其实就是由一个个压缩的数据块组成的,每个数据块的大小在 64KB ~ 1MB之间。

 column.bin数据文件的组成

 6、数据标记

关于数据标记,数据标记文件也与xxx.bin文件一一对应,是一级索引与数据块之间关系的数据。

每一列字段 xxx.column都对应有一个 xxx.mrk文件标记 

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

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

相关文章

企业数字转型加速器!居然是他!该不会还有人没用上吧?

随着数字化时代的到来和技术的发展&#xff0c;企业数字化转型已经成为全球企业发展的重要趋势。然而&#xff0c;数字化转型的过程却并非一帆风顺&#xff0c;常常因为 IT 复杂度高、开发周期长等问题而遇到许多挑战&#xff0c;这时候低代码开发平台就能够发挥重要作用。 低代…

我们为什么还要学习Altium Designer?

Altium Designe&#xff08;简称“AD”&#xff09;是电子设计领域中备受推崇的软件工具之一&#xff0c;拥有强大的功能和灵活的设计环境&#xff0c;也是要用最广泛的EDA工具之一&#xff0c;为电子工程师提供了无限可能&#xff0c;但很多工程师学完AD基本操作就转投其他EDA…

支付宝小程序打包成APP

发行——原生App-云打包——填写安卓包的信息&#xff08;安卓证书可在香蕉云编下载&#xff09;——打包——下载APK 第一步&#xff1a;点击菜单栏发行 第二步&#xff1a;选择远程APP-云打包 第三步&#xff1a;在香蕉云编&#xff08;https://www.yunedit.com/&#xff0…

K8S之yaml文件,声明式管理方法

目录 第一章.声明式管理方法 1.1.声明式管理方法 1.2.kubectl create 和 kubectl apply区别 1.3.查看资源配置清单 1.4.解释资源配置清单 1.5.修改资源配置清单并应用 第二章.yaml文件格式 2.1.yaml文件简述 2.2.YAML 语法格式 2.3.查看 api 资源版本标签 2.4.写一个…

MVC中Controller向View传值的几种方式

MVC中Controller向View传值的几种方式 文章目录 MVC中Controller向View传值的几种方式一、ViewModel使用ViewModel 二、ViewData在控制器和视图间使用ViewData传递数据在 ViewDataTest 视图中使用ViewData的数据在视图和部分视图间使用ViewData 三、ViewBag四、TempData五、Ses…

搭建短链服务

目录 一、背景 1.1短链接的优势 1.1.1优点一 1.1.2优点二 1.1.3优点三 1.1.4优点四 1.1.4优点五 二、原理 2.1利用http重定向 3.1实现方案 3.1.1发号器实现 3.1.2存储实现 3.1.3映射实现 3.2架构图 一、背景 短链在互联网中盛行&#xff0c;搭建自己短链平台&…

硬件工程师-MOS管

MOSFET 场效应管 N管 P管 对标三极管 N管 P管 三极管具有功率放大的作用 MOSFET也具有功率作用&#xff0c; 控制级的电流很小 控制信号的内阻大 输出级的电流很大 输出信号的内阻很小 三极管的缺点&#xff1a;流控…

Blender 建模键盘(PS修图、UV贴图、Cycles渲染引擎)

目录 1. 键盘模型1.1 键盘底座1.2 底座细节1.3 logo位置1.4 键盘按键1.5 按键添加1.6 合并按键 2. 贴图、渲染2.1 到PS添加按键文字2.2 保存png图片2.3 图像纹理2.4 UV编辑2.5 添加平面2.6 添加环境纹理2.7 灯光、摄像机2.8 渲染属性2.9 渲染出图 1. 键盘模型 原图 1.1 键盘底…

三、IOC容器(2)

四、IOC操作Bean管理&#xff08;xml注入集合属性&#xff09; 4.在集合里面设置对象类型值 ①Course类 ②Stu类 ③配置xml文件 ④测试 5.把集合注入部分提取出来 在Spring配置文件中引入名称空间 util 2.使用util标签完成list集合注入 ①提取list集合类型的属性注入 <…

如何调整碳化硅 MOSFET 驱动来减少功率损耗

如何调整碳化硅 MOSFET 驱动来减少功率损耗 1.如何减少传导损耗&#xff1f;2.如何减少开关损耗&#xff1f;2.1 关断损耗 (Eoff) 取决于 Rg 和 Vgs-off2.2 开通损耗 (Eon) vs. Rg2.3 开通损耗 Eon 和反向恢复损耗 Err 的米勒效应2.4 对驱动电流的要求 作者&#xff1a;Xiou 参…

销售/回收DSOS254A是德keysight MSOS254A混合信号示波器

Agilent DSOS254A、Keysight MSOS254A、 混合信号示波器&#xff0c;2.5 GHz&#xff0c;20 GSa/s&#xff0c;4 通道&#xff0c;16 数字通道。 ​Infiniium S 系列示波器 信号保真度方面树立新标杆 500 MHz 至 8 GHz 出色的信号完整性使您可以看到真实显示的信号&#xff1…

远程桌面连接不上解决方法

远程桌面连接是一种方便快捷的技术&#xff0c;可以让用户在不同的设备之间共享桌面和访问远程计算机。然而&#xff0c;有时候我们可能会遇到远程桌面连接无法正常连接的问题。在本篇文章中&#xff0c;我们将详细介绍远程桌面连接无法连接的常见原因&#xff0c;并提供相对应…

0601-指针的基础

内存 物理存储器和存储地址空间 物理存储器&#xff1a;实际存在的具体存储器芯片。比如&#xff1a;内存条、RAM芯片、ROM芯片。 存储地址空间&#xff1a;对存储器编码的范围。 编码&#xff1a;对每个物理存储单元&#xff08;一个字节&#xff09;分配一个号码寻址&…

520网络情人节:用双语告白你的女神男神!

网络情人节&#xff08;Network Valentines Day&#xff09;——520、521被喻为“我愿意、我爱你” 的意思&#xff0c;又被称为“结婚吉日”、“表白日”、“撒娇日”、“求爱节”。每年5月20日和5月21日的“网络情人节”也成为了情侣们扎堆登记结婚、隆重举办婚宴 的吉日。 5…

系统分析师经典易错题,解题思路一

数据库通常采用三级模式结构,其中,视图对应外模式,基本表对应模式,存储文件对应内模式。数据的独立性是由DBMS的二级映像功能来保证的。数据的独立性包括数据的物理独立性和数据逻辑独立性。数据的物理独立性是指当数据库的内模式发生改变时,数据的逻辑结构不变。为了保证…

HTML获取SpringBoot从model传的值

controller层如下&#xff1a; html获取格式&#xff1a;[[${传入的值}]] 效果图&#xff1a;

Mybatis操作数据库执行流程的先后顺序是怎样的?

MyBatis是一个支持普通SQL查询、存储及高级映射的持久层框架&#xff0c;它几乎消除了JDBC的冗余代码。使Java开发人员可以使用面向对象的编程思想来操作数据库。对于MyBatis的工作原理和操作流程的理解&#xff0c;我们先来看下面的工作流程图。 MaBatis的工作流程 在上图中…

VMware和Ubuntu20.04的安装

VMware安装&#xff1a; 1、下载好VM后右击管理员运行&#xff1a; PS&#xff1a;推荐大家去官网下载&#xff0c;如果需要许可密钥的话&#xff0c;可以去搜一下&#xff0c;或者私信一下UP&#xff0c;链接放下面了。 VM官网 因为我已经安装好了&#xff0c;所以就不在贴…

Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff0c;如果…

5.1图的物理结构与基本操作

1.图的物理结构 一.邻接矩阵存储稠密图 用于存储无向图&#xff0c;有向图&#xff0c;总之各类图 优缺点&#xff1a;适合存储稠密图&#xff0c;属于上下三角矩阵&#xff0c;有重复 复杂度&#xff1a;O(V),空间O(V^2) 性质&#xff1a;阶乘得到某一点的值&#xff0c;为顶…