第四章 MergeTree原理分析

news2024/11/15 11:08:49

一、存储结构

1.1 表引擎语法结构

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree() -- 表引擎
[PARTITION BY expr] -- 分区键
[ORDER BY expr] -- 排序键
[PRIMARY KEY expr] -- 主键
[SAMPLE BY expr] -- 抽样表达式
[SETTINGS name=value, ...] -- 索引配置项
  1. 分区键,可以是某个列、也可以是多个列组成的元组,也可以是一个表达式。如果不声明分区键,则ClickHouse会生成一个名为all的分区
  2. 排序键,可以是某个列、也可以是多个列组成的元组
  3. 主键,默认与排序键相同,可以不声明,依照主键会生成一级索引
  4. 抽样表达式,声明数据以何种标准进行采样,如果配置此配置项,则需要在主键中声明相同的表达式,即按照主键进行抽样
  5. SETTINGS:
    1. index_granularity - 索引粒度,默认值8192,该值通常不需要修改,即每隔8192行数据生成一条索引
    2. index_granularity_bytes - 索引间隔,默认为10M,索引大小间隔,设置为0则不开启自适应功能
    3. enable_mixed_granularity_parts - 设置是否开启自适应索引间隔功能,默认开启
    4. merge_with_ttl_timeout - TTL功能
    5. storage_policy - 多路径存储策略

 1.2 数据物理存储结构

        MergeTree表引擎中的数据拥有物理存储,数据按照分区目录的形式保存在磁盘上,存储结构如下图:

  1.  parition:分区目录,相同分区的数据会被合并到同一分区目录,不同分区的数据永远不会被合并到一起
  2. checksums.txt:校验文件,二进制格式存储。包含primary.idx、count.txt等文件的大小(size)和size的哈希值,用于快速校验文件的完整性和正确性
  3. columns.txt:列信息文件,明文格式存储,用于保存此数据分区下的列字段信息
  4. count.txt:技术文件,明文格式存储,用于记录当前分区数据目录下的数据总行数
  5. primary.idx:一级索引文件,二进制格式存储。用于存放稀疏索引
  6. [Column].bin:数据文件,使用压缩格式存储,默认为LZ4压缩格式,用于存储某一列的数据
  7. [Column].mrk:列字段标记文件,二进制格式存储,保存了.bin文件中的数据偏移量信息。标记文件与稀疏索引对其,与.bin文件一一对应,MergeTree通过其建立primary.idx稀疏索引与.bin数据文件之间的映射关系
  8. [Column].mrk2:如果使用了自适应大小的索引间隔,则标记文件会以.mrk2命名,原理与.mrk类似
  9. partition.dat:二进制格式存储,保存当前分区下分区表达式最终生成的值
  10. minmax_[Column].idx:二进制格式存储,记录当前分区下分区字段对应原始数据的最小最大值

二、数据分区

2.1 数据分区规则

        MergeTree数据分区规则由分区ID决定,每个分区ID是由分区键的取值决定,分区ID的生成逻辑规则有:

  1. 不指定分区键,如果不使用PARTITION BY声明任何分区表达式,则分区ID命名为all
  2. 整型:兼容UInt64,包括有符号整型和无符号整型
  3. 日期类型:分区键值属于日期类型,或能够转换为YYYYMMDD格式的整型,则按照YYYYMMDD进行格式化后的字符形式输出
  4. 其他类型:如果不是整型、日期类型,则通过128位Hash算法取Hash值作为分区ID值

2.2 分区目录的命名规则

        分区目录命名公式:

        PartitionID_MinBlockNum_MaxBlockNum_Level

  1. PartitionID:分区ID
  2. MinBlockNum/MaxBlockNum:最小数据块编号和最大数据块编号
  3. Level:合并的层级,及某个分区被合并过的次数,初始值为0

2.3 分区目录的合并过程

        分区目录合并过程见下图:

三、索引

3.1 一级索引

        MergeTree的定义主键后,会依据index_granularity间隔(默认为8192行),为数据表生成一级索引并保存至primary.idx文件内,索引数据按照主键排序。

        索引文件:primary.idx

        索引实现:稀疏索引

        优势:使用少量的索引标记能够记录大量数据的区间位置信息,数据量越大优势越明显

        特点:以默认的索引粒度8192为例,MergeTree只需要12208行索引标记就能为1亿行数据记录提供索引。由于洗漱索引占用空间小,所以primary.idx内的索引数据常驻内存,读取速度很快。

3.2 二级索引

        二级索引又称为跳数索引,由数据聚合信息构建而成。

        关键参数:granularity

        参数含义:按照index_granularity将数据划分为n个区间,再将granularity个区间聚合汇总生成一行minmax索引

        索引类型:

  • minmax:minmax索引记录一段数据内的最小和最大极值,能够快速跳过无用的数据区间
  • set:set索引记录了声明字段或表达式的取值(唯一值、无重复),完整形式为set(max_rows),表示在index_granularity内,索引最多记录的数据行数,如果max_rows=0,则表示无限制
  • ngrambf_v1:ngrambf_v1索引记录的是数据短语的布隆过滤器,只支持String和FixedString数据类型。只能够提升in、notIn、like、equals和notEquals查询的性能,完整形式为ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)
    • n - 短语长度
    • size_of_bloom_filter_in_bytes - 布隆过滤器大小
    • number_of_hash_functions - 布隆过滤器使用Hash函数的个数
    • random_seed:Hash函数的随机种子
  • tokenbf_v1:tokenbf_v1索引是ngrambf_v1的变种,会自动按照非字符、数字的字符串分割token

五、数据存储

5.1 按列存储

        MergeTree中,数据按列存储,每个列字段都拥有一个与之对应的.bin数据文件,数据目录以分区目录的形式存放,所以在.bin文件中只会保存当前分区片段内的这一部分数据。

        写入前的处理:

  1. 数据需要经过压缩,默认使用LZ4算法
  2. 数据会事先依照order by 的声明排序
  3. 数据以压缩数据块的形式被组织并写入.bin文件

5.2 压缩数据块

        压缩数据块由两部分组成:

  1. 头文件 —— 压缩算法、数据压缩后大小、数据压缩前大小
  2. 压缩数据

        每个压缩数据块的体积,按照其压缩前的数据字节大小,都被严格控制在64kb~1MB之间,由min_compress_block_size(默认64k) 和max_compress_block_size(默认1M)限制其上下限。

        写入过程,按照索引粒度,按批次获取数据并进行处理,其过程如下:

  1. 单个批次数据size < 64kb:如果单个批次数据小于64kb,则继续获取下一批次数据,直到累积size >= 64kb,生成下一个压缩数据块
  2. 单个批次数据64kb < size <= 1MB:则直接生成下一个压缩数据块
  3. 单个批次数据size > 1MB:首先按照1MB大小截断并生成下一个压缩数据块。剩余数据继续依据上述规则执行。此时一个批次数据会生成多个压缩数据块。

六、数据标记

        数据标记就是记录了一级索引与压缩数据块的关联关系,基于此,能够很快地找到数据块中需要的数据。

工作方式:

  1. 读取解压数据块 —— 在查询某一列数据的时候,MergeTree无须一次性加载整个.bin文件,可以根据偏移量区间,获取指定的压缩数据块。如读取.bin文件中的[0, 10816]字节数据,就能获取第0个压缩数据块
  2. 读取数据 —— 在读取解压后的数据时,MergeTree并不需要一次性扫描整段解压数据,它可以根据偏移量按需读取数据。如通过[0, 8192]能够读取压缩数据块0中的第一个数据片段

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

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

相关文章

【遇见青山】项目难点:解决超卖问题

【遇见青山】项目难点&#xff1a;解决超卖问题1.乐观锁方案2.悲观锁方案1.乐观锁方案 原始实现下单功能的方法&#xff1a; /*** 秒杀实现** param voucherId 秒杀券的ID* return Result*/ Override Transactional public Result seckillVoucher(Long voucherId) {// 查询优…

备战蓝桥杯【高精度加法和高精度减法】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

IDEA中使用自定义的maven

步骤 1.下载maven maven下载 2.配置maven 2.1设置环境变量 1.在“环境环境“–“系统环境“–“path”中加入&#xff08;设置到bin目录下&#xff09; 2.测试环境变量是否成功 C:\Users>mvn -v //在控制台输入mav -v,看是否输出以下结果 Apache Maven 3.9.0 (9b…

《MySQL系列-InnoDB引擎23》文件-InnoDB存储引擎文件-重做日志文件

InnoDB存储引擎文件 之前介绍的文件都是MySQL数据库本身的文件&#xff0c;和存储引擎无关。除了这些文件外&#xff0c;每个表存储引擎都有其自己独有的文件。本节将具体介绍与InnoDB存储引擎密切相关的文件&#xff0c;这些文件包括重做日志文件、表空间文件。 重做日志文件…

Docker的资源控制管理

目录 一、CPU控制 1、设置CPU使用率上限 2、设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 3、设置容器绑定指定的CPU 二、对内存使用进行限制 1、创建指定物理内存的容器 2、创建指定物理内存和swap的容器 3、 对磁盘IO配额控制&#xff08;blkio&a…

使用Docker容器部署java运行环境(java8 + mysql5.7 + redis5.0 + nginx1.14.1

环境&#xff1a;阿里云ECS服务器一.Docker环境安装1.1 安装工具sudo yum install -y yum-utils device-mapper-persistent-data lvm21.2 为yum源添加docker仓库位置yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo1.3 将软件…

【微信小游戏开发笔记】第二节:Cocos开发界面常用功能简介

Cocos开发界面常用功能简介 本章只介绍微信小游戏开发时常用的功能&#xff0c;其他功能不常用&#xff0c;写多了记不住&#xff08;其实是懒 -_-!&#xff09;&#xff1a; 层级管理器&#xff0c;用于操作各个节点。资源管理器&#xff0c;用于操作各种文件资源。场景编辑…

SpringMVC--简介和入门案例

SpringMVC简介 什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M:Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类: 一类称为实体类Bean:专门存储业务数据的&#xff0c;如 Studen…

西湖论剑初赛web wp

Node Magical Login 简单的js代码审计。 Flag分成了两部分。 第一部分&#xff1a; 这里就简单的判断了一下user是否等于admin&#xff0c;直接绕过。 第二部分&#xff1a; checkcode ! “aGr5AtSp55dRacer”&#xff0c;让其为真&#xff0c;利用数组绕过。 Flag为&#x…

家政服务小程序实战教程03-创建自定义应用

我们上一篇讲解了创建模型应用&#xff0c;模型应用是给管理员使用的。普通用户日常办理业务还是在小程序完成。 微搭中的小程序需要通过创建自定义应用来创建&#xff0c;进入控制台&#xff0c;点击应用&#xff0c;点击新建应用&#xff0c;选择新建自定义应用 输入应用的名…

微信小程序 java家校通Springboot中小学家校联系电子作业系统

小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 通过对各种资料的收集&#xff0c;了解到“校讯通”是联系社会的窗口&#xff0c;是实现家校联系工作和学校…

【参加CUDA线上训练营】零基础cuda—矩阵转置实现及其优化

【参加CUDA线上训练营】零基础cuda—矩阵转置实现及其优化1.不使用Shared Memory2.使用Shared Memory3.使用Shared Memory&#xff0c;并加入No Bank Conflicts4.效果对比参考文献本文参考Nvidia官方blog[An Efficient Matrix Transpose in CUDA C/C及其对应的github代码transp…

可视化图表的思路

数据表达 excel — 小量级一次性的数据处理 Tableau等BI — 批量的数据读取与分析 python — 复杂的数据清洗、爬虫和算法建模 图表展示原则&#xff1a;客观&#xff0c;高效&#xff0c;直观 表达格式&#xff1a;观点数据补充信息图表 图表选择思路 规模、趋势、占比、关…

RabbitMQ-延迟队列

一、介绍延迟队列&#xff0c;队列内部是有序的&#xff0c;最重要的特性就体现在他的延迟属性上&#xff0c;延时队列中的元素是希望在指定时间到了或之前取出和处理&#xff0c;简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列。 二、sprin…

TCP的协议格式 --- 20字节固定长度 + 40字节可选数据

目录 一、 20字节的固定长度 16位源端口和16位目的端口号&#xff0c;32位序号&#xff0c;32位确认属序号&#xff0c;4位首部长度&#xff08;需要乘4&#xff09; 保留&#xff08;6位&#xff09; 16位窗口大小 16位的校验和16位的紧急指针 二、40字节可选数据 1.2.1、…

软件设计师教程(六)计算机系统知识-操作系统知识

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;…

最新中文版FL Studio21水果软件下载安装图文教程

FL Studio是目前流行广泛使用人数最多音乐编曲制作软件&#xff0c;这款软件相信广大网友并不陌生&#xff0c;今天带来的是FL中文版本&#xff0c;所有的功能都能在线编辑&#xff0c;用户直接就能操作&#xff0c;同时因为是21水果是最新版&#xff0c;所以增加了新的功能&am…

【Spring Cloud总结】1、服务提供者与服务消费者快速上手

目录 文件结构 代码 1、api 1.1实体类&#xff08;Dept &#xff09; 1.2数据库 2、provider 2.1 DeptController 2.2 DeptDao 2.3 DeptService 2.4 DeptServiceImpl 2.5 application.yml 3、consumer 3.1 ConfigBean 3.2 DeptConsumerController 测试 1.启动…

创建阿里云物联网平台

创建阿里云物联网平台 对云平台设备创建过程做记录&#xff0c;懒得再看视频 文章参考视频&#xff1a;https://www.bilibili.com/video/BV1jP4y1E7TJ?p26&vd_source50694678ae937a743c59db6b5ff46c31 阿里云&#xff1a;https://www.aliyun.com 1&#xff0e;物联网平…

基于jsp的网络电子相册的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科学技术的不断进步&#xff0c;云技术以及大数据的不断完善&#xff0c;越来越多的网络忠实用户告别了冲洗相片的时代&#xff0c;他们更喜欢将相片上传至网络&#xff0c;这样就省去了携带和查找的麻烦&#xff0c;随时随地只…