大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引

news2024/9/21 14:40:30

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(正在更新···)

章节内容

上节我们完成了如下的内容:

  • 表引擎详解 介绍
  • 日志部分
  • Log部分
  • Memory部分
  • Merge部分
    在这里插入图片描述

MergeTree

ClickHouse中最强大的表引擎当属 MergeTree(合并树)引擎及该系列(*MergeTree)中的其他引擎。
MergeTree 引擎系列的基本理念如下,当你有巨量数据要插入到表中,你要高效的一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并,相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。

存储结构

创建新表

CREATE TABLE mt_table(date Date, id UInt8, name String) 
ENGINE = MergeTree PARTITION BY toYYYYMM(date) ORDER BY id;

CREATE TABLE mt_table3 (
  `date` Date,
  `id` UInt8,
  `name` String
) ENGINE = MergeTree PARTITION BY toYYYYMM(date) ORDER BY id;

执行的结果如下图所示:
在这里插入图片描述

插入数据

INSERT INTO mt_table VALUES ('2024-07-31', 1, 'wzk');
INSERT INTO mt_table VALUES ('2024-07-30', 2, 'icu');
INSERT INTO mt_table VALUES ('2024-07-29', 3, 'wzkicu');

执行结果如下图所示:
在这里插入图片描述

查看目录

cd /var/lib/clickhouse/data/default/mt_table
ls

执行结果如下图所示:
在这里插入图片描述
我们随便进入一个目录,可以看到:

  • bin 是按列保存数据的文件
  • mrk 保存块偏移量
  • primary.idx 保存主键索引

存储结构

.
├── 202407_1_1_0
│   ├── checksums.txt
│   ├── columns.txt
│   ├── count.txt
│   ├── data.bin
│   ├── data.mrk3
│   ├── default_compression_codec.txt
│   ├── minmax_date.idx
│   ├── partition.dat
│   └── primary.idx
├── 202407_2_2_0
│   ├── checksums.txt
│   ├── columns.txt
│   ├── count.txt
│   ├── data.bin
│   ├── data.mrk3
│   ├── default_compression_codec.txt
│   ├── minmax_date.idx
│   ├── partition.dat
│   └── primary.idx
├── 202407_3_3_0
│   ├── checksums.txt
│   ├── columns.txt
│   ├── count.txt
│   ├── data.bin
│   ├── data.mrk3
│   ├── default_compression_codec.txt
│   ├── minmax_date.idx
│   ├── partition.dat
│   └── primary.idx
├── detached
└── format_version.txt

执行结果如下图所示:
在这里插入图片描述

  • checknums.txt 二进制校验文件,保存了余下文件的大小size和size的hash值,用于快速校验文件的完整和正确性
  • columns.txt 明文的列信息
  • date.bin 压缩格式(默认LZ4)的数据文件,保存了原始数据,以列名 bin 命名。
  • date.mrk2 使用了自适应大小的索引间隔
  • primary.idx 二进制一级索引文件,在建表的时候通过 order by 或者 primary key 声明稀疏索引。

数据分区

数据是以分区目录的形式组织的,每个分区独立分开存储。这种形式,在数据查询的时候,可以有效的跳过无用的数据文件。

分区规则

分区键的取值,生成分区ID,分区根据ID决定,根据分区键的数据类型不同,分区ID的生成目前有四种规则:

  • 不指定分键
  • 使用整型
  • 使用日期类型 toYYYYMM(date)
  • 使用其他类型
    数据在写入的时候,会按照分区ID落入对应的分区。

分区目录生成

  • BlockNum 是一个全局整型,从1开始,每当新创建一个分区目录,此数字就累加1。
  • MinBlockNum:最小数据块编号
  • MaxBlockNum:最大数据块编号
  • 对于一个新的分区,MinBlockNum和MaxBlockNum的值是相同的

分区目录合并

MergeTree 的分区目录在数据写入过程中被创建,不同的批次写入数据属于同一分区,也会生成不同的目录,在之后某个时刻再合并(写入后10-15分钟),合并后的旧分区目录默认8分钟后删除。

同一个分区的多个目录合并以后得命名规则:

  • MinBlockNum:取同一分区中MinBlockNum值最小的
  • MaxBlockNum:取同一分区中MaxBlockNum最大的
  • Level:取同一分区最大的Level值+1

一级索引

稀疏索引

文件:primary.idx
MergeTree的主键使用PrimaryKey定义,主键定义之后,MergeTree会根据index_granularity间隔(默认8192)为数据生成一级索引并保存至primary.idx中,这种方式就是稀疏索引。
简化形式:通过 ORDER BY 指代 主键

primary.idx 文件的一级索引采用稀疏索引。

  • 稠密索引:每一行索引标记对应一行具体的数据记录
  • 稀疏索引:每一行索引标记对应一段数据记录(默认索引粒度是8192)

在这里插入图片描述
稀疏索引占用空间小,所以primary.idx内的索引数据常驻内存,取用速度快。

生成规则

primary.idx文件,由于稀疏索引,所以MergeTree要间隔index_granularity行数据才会生成一个索引记录,其他索引值会根据声明的主键字段获取。

查询过程

索引是如何工作的?对primary.idx文件的查询过程

  • MarkRange: 一小段数据区间,按照 index_granularity的间隔粒度,将一段完整的数据划分成多个小的数据段,小的数据段就是MarkRange
  • MarkRange与索引编号对应

小案例:

  • 200行数据
  • index_granularity大小为5
  • 主键ID为int,取值从0开始

共200行数据/5 = 40个MarkRange
在这里插入图片描述
假设索引查询 where Id = 3

  • 第一步:形成区间格式 [3,3]
  • 第二步:进行交集 [3,3] ∩ [0, 199]
    以MarkRange的步长大于8分块,进行剪枝:
    在这里插入图片描述
  • 第三步:合并, MarkRange(start0, end20)

在ClickHouse中,MergeTree引擎表的索引列在建表使用ORDER BY语法来指定。
而在官方中,用了下面一副图来说明。
在这里插入图片描述
这张图示出了以 CounterID、Date两列为索引列的情况,即先以CounterID为主要关键字排序,再以Date为次要关键字排序,最后用两列的组合作为索引键。Marks与MarkNumbers就是索引标记,且Marks之间的间隔就由建表时的索引粒度参数index_granularity来制定,默认是8192。

在 ClickHouse 之父Alexey Milovidov分享的PPT中,有更加详细的图示:
在这里插入图片描述

这样,每一列都通过ORDER BY列进行了索引,查询时,先查找到数据所在的parts,再通过mrk2文件确定bin文件中数据的范围即可。
不过,ClickHouse的稀疏索引与Kafka的稀疏索引不同,可以由用户自由组合多列,因此也要格外注意不要加入太多索引列,防止索引数据过于稀疏,增大存储和查找成本。另外,基数太小(即区分度太低)的列不适合做索引列,因为很有可能横跨多个mark值仍然相同,没有索引的意义了。

跳数索引

  • index_granularity 定义了数据的粒度
  • granularity定义了聚合信息汇总的粒度
  • granularity定义了一行跳数索引能够跳过多少个index_granularity区间的数据

可用类型

  • minmax存储指定表达式的极值(如果表达式是tuple,则存储tuple中每个元素的极值),这些信息用于跳过数据块,类似主键
  • set(max_rows)存储指定表达式的唯一值(不超过max_rows个,max_rows=0则表示无限制)。这些信息可以用于检查 WHERE 表达式是否满足某个数据块
  • ngrambf_v1 存储包含数据块中所有N元短语的布隆过滤器。只可用于字符串上,用于优化equals、like和in表达式的性能。
  • tokenbf_v1 跟 ngrambf_v1 类似,不同于ngrams 存储字符串指定长度的所有片段,它只存储被非字母数据字符分割的片段。

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

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

相关文章

CAD图1

文章目录 选择直线工具选择圆形选中圆形 选择直线工具 画一条十字中心线 选择圆形 以十字中心为起点画一个半径为 53 的圆形 选中圆形 选中圆形,捕捉右侧圆形焦点

【北京迅为】《STM32MP157开发板使用手册》- 第四十章 二值信号量实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

②MODBUS TCP 转 RS485(RS485与TCP数据双向互传)MODBUS TCP与MODBUS RTU互转(无需编程 独立通道)

型号:1路总线TCP网关(单网口) MS-A1-5011 1路总线TCP网关(双网口) MS-A2-5011 2路总线TCP网关(单网口) MS-A1-5021 2路总线TCP网关(双网口) MS-A2-5021 4路总…

怎样把PPT上顽固的图标删了

例如: 解决: 首先打开下载好的PPT模板,然后在视图选项卡里面找到幻灯片母版。 进入幻灯片母版后,找到第一页母版页就会看到LOGO了,这时使用鼠标就可以选中删除啦。

【Web】从网安的角度浅聊Groovy命令执行

什么是 Groovy? Groovy 是一种基于 Java 平台的动态语言,旨在提高开发效率。它与 Java 语言高度兼容,允许开发者以更简洁的方式编写代码。Groovy 支持面向对象编程、闭包、DSL(领域特定语言)等特性,使得它…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(上)

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案…

Eclipse离线安装Tomcat插件

Eclipse离线安装Tomcat插件 最近的自己在对低版本的代码的进行维护补丁,不得不采用Eclipse 来进行跑项目,真的是折磨 其中遇到一个问题就是打开Eclipse的2021版,安装Tomcat的插件,发现好家伙,就是死活在线安装失败 (喵的,真的是让我抓耳挠腮!!哈哈哈) 无奈,只好采用离线安装,特…

C# 携手 7-Zip 命令行:大文件压缩的终极武器?

前言 嗨,大家好! 今天咱们来聊聊如何用 C# 调用 7-Zip 命令行来压缩大文件,这是个既高效又稳定的好办法,亲测有效! 在实际工作中,压缩文件几乎是家常便饭,但可惜的是,许多常用的方…

VBS学习2:问题解决(文件中含义中文运行报错或者中文乱码)

文件中含义中文运行报错或者中文乱码 问题 msgbox"fdsfdsf大蘇打撒旦dsfsdffsdfsd发斯蒂芬斯蒂芬"解决 文件编码修改成GB2312

JAVA开源项目 校园美食分享平台 计算机毕业设计

本文项目编号 T 033 ,文末自助获取源码 \color{red}{T033,文末自助获取源码} T033,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

springboot通过tomcat部署项目(包含jar、war两种方式,迄今为止全网最详细!2024更新..建议收藏,教学!万字长文!)

本博客参考的所有文章均已在结尾声明!!! 在 Spring Boot 项目中,有两种常见的部署方式: 1、使用 Spring Boot 自带的 内置 Tomcat,将项目打包为 jar 并直接运行。 2、使用 外置 Tomcat,将项目打…

DHCP服务(relay中继)实验简述

一、DHCP服务(relay中继模式) 一、配置接入交换机LSW 2 The device is running! sys Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]sysname LSW2 [LSW2]vlan batc…

记录可编辑表格(未完整)

每一行都独立 <el-table-column label"操作" width"220" fixed"right"><template #default"{ row, $index }"><el-buttonv-if"!row.tableEditFlag"type"primary"size"small"click"…

中间件:maxwell、canal

文章目录 1、底层原理&#xff1a;基于mysql的bin log日志实现的&#xff1a;把自己伪装成slave2、bin log 日志有三种模式&#xff1a;2.1、statement模式&#xff1a;2.2、row模式&#xff1a;2.3、mixed模式&#xff1a; 3、maxwell只支持 row 模式&#xff1a;4、maxwell介…

Vue 自定义指令实战

引言 Vue自定义指令是Vue.js框架中强大而灵活的功能之一&#xff0c;它允许开发者根据具体需求创建自定义的指令&#xff0c;以实现更加精细化的交互和数据绑定效果。本文将带你深入探索Vue自定义指令的使用方法、原理和实战&#xff0c;为你打开前端开发的新视野。 我们前面…

2024年汉字小达人区级自由报名备考冲刺:今年官方模拟题练一练

2024年第十一届汉字小达人的区级活动的时间9月25-30日正式开赛&#xff0c;还有一周就开始了。 有一些孩子刚刚被老师通知可以参加这个比赛&#xff0c;担心现在准备汉字小达人比赛是否来得及。根据我的经验&#xff0c;精准备考还是有希望的&#xff0c;也可以把这个比赛当做…

视频怎么提取音频?一键音频提取,视频内容轻松听!

视频怎么提取音频&#xff1f;一键解锁音频世界&#xff0c;让视频精彩不再静默&#xff01;无论您是忙碌于日常工作的上班族&#xff0c;还是热衷于学习的求知者&#xff0c;亦或是享受闲暇时光的聆听者&#xff0c;一键提取音频功能让视频内容瞬间转化为耳畔的温柔低语&#…

51单片机——直流电机驱动

1、直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转。 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&#xff09;和…

Java双端队列ArrayDeque

概述 双端队列ArrayDeque是Java集合框架中的一种数据结构&#xff0c;它实现了Deque接口&#xff0c;因此支持在两端进行添加和移除元素。通过名称也能看出&#xff0c;ArrayDeque是基于数组实现的&#xff0c;ArrayDeque内部使用一个可动态调整大小的环形数组来存储元素。当Ar…

函数递归(上)

目录 1.递归是什么&#xff1f; 1.1 递归的思想&#xff1a; 2.顺序打印⼀个整数的每⼀位 ​编辑3 迭代 4.求第n个斐波那契数 1.递归是什么&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。 #include <stdio.h…