ClickHouse实战处理(一):MergeTree表引擎

MergeTree作为家族系列最基础的表引擎,主要有以下特点:

  1. 存储的数据按照主键排序:创建稀疏索引加快数据查询速度。
  2. 支持数据分区,可以通过PARTITION BY语句指定分区字段。
  3. 支持数据副本。
  4. 支持数据采样。

一、MergeTree分类和建表参数

MergeTree系列表引擎包含:MergeTree、ReplacingMergeTree、ReplicatedMergeTree(复制表)、SummingMergeTree(汇总求和功能)、AggregatingMergeTree(聚合功能)、CollapsingMergeTree(折叠删除功能)、VersionedCollapsingMergeTree(版本折叠功能)引擎,在这些的基础上还可以叠加Replicated和Distributed。

MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段在磁盘上不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。这种数据片段往复合并的特点,也正是合并树名称的由来。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]
​关于以上建表语句的解释如下:

1、ENGINE:ENGINE = MergeTree(),MergeTree引擎没有参数。

2、ORDER BY:排序字段。比如ORDER BY (Col1, Col2),值得注意的是,如果没有使用 PRIMARY KEY 显式的指定主键ORDER BY排序字段自动作为主键。如果不需要排序,则可以使用 ORDER BY tuple() 语法,这样的话,创建的表也就不包含主键。这种情况下,ClickHouse会按照插入的顺序存储数据。必选项。

3、PARTITION BY:分区字段,例如要按月分区,可以使用表达式 toYYYYMM(date_column),这里的date_column是一个Date类型的列,分区名的格式会是"YYYYMM"。可选。

4、PRIMARY KEY:指定主键,如果排序字段与主键不一致,可以单独指定主键字段。否则默认主键是排序字段。大部分情况下不需要再专门指定一个 PRIMARY KEY 子句,注意,在MergeTree中主键并不用于去重,而是用于索引,加快查询速度。可选。

另外,如果指定了PRIMARY KEY与排序字段不一致,否则报错。要保证PRIMARY KEY 指定的主键是ORDER BY 指定字段的前缀,这样主键仍然是排序键的前缀,不会出现索引与数据顺序混乱的问题。
比如: 
.......
ORDER BY (A,B,C)
PRIMARY KEY A 

5、SAMPLE BY:采样字段,如果指定了该字段,那么主键中也必须包含该字段。比如 SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))。可选。

6、TTL:数据的存活时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这一列的数据;如果是表级别的TTL,则会删除整张表的数据。可选。

7、SETTINGS:额外的参数配置。可选。

二、分区目录的合并过程

在将新数据插入表中时,每个分区的数据按照目录存储为单独的数据片段, 目录名为数据片段名称,这个和system.parts表的name字段一致。
在插入后的10-15分钟内,同一个分区的数据片段将合并为一个整体的数据片段。数据片段名称包含了4部分的信息,下面以数据片段20200421_1_2_1为例进行拆解:

  • 20200421是分区名称。
  • 1是数据块的最小编号。
  • 2是数据块的最大编号。
  • 1是块级别,即该块在MergeTree中的深度。
1、分区目录的合并过程
  1. active列为数据片段的状态。1表示激活状态,0表示非激活状态。当源数据片段合并为较大的片段之后,这些源的数据片段就变为了非激活状态。损坏的数据片段也是非激活状态。
  2. 同一分区有多个独立的数据片段,这表明这些片段尚未合并。
    ClickHouse会在插入后大约15分钟合并数据片段,也可以使用OPTIMIZE语句执行计划外的合并:
    OPTIMIZE TABLE mergeTableDemo PARTITION 202004;
  3. 非激活的片段(active=0片段)将在合并后约10分钟被删除。
  4. detached目录包含使用DETACHED语句从表分离的数据片段。 损坏的数据片段也将移至该目录,而不是被删除。ClickHouse不会使用detached目录中的数据片段。 此目录中的数据可以随时添加、删除或修改,ClickHouse只有在运行ATTACH语句时才会感知该目录。

3、MergeTree引擎表目录解析

这里我们介绍下MergeTree引擎表对应到磁盘的数据目录,Clikchouse新版本与之前版本对比,数据对应的磁盘目录略有不同。

创建表t_mt,并加载数据:

CREATE TABLE t_mt
(
id UInt8,
name String,
age UInt8,
birthday Date,
location String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(birthday)
ORDER BY (id, age)

#向表t_mt中插入数据

insert into t_mt values (1,'张三',18,'2021-06-01','上海'), (2,'李四',19,'2021-02-10','北京'), (3,'王五',12,'2021-06-01','天津'), (1,'马六',10,'2021-06-18','上海'), (5,'田七',22,'2021-02-09','广州');

以上创建好表t_mt,当插入数据完成后,在ClickHouse节点/var/lib/ClickHouse/data/newdb/路径下会生成对应目录“t_mt”,进入此目录下,可以看到对应的分区目录,如图示:
在这里插入图片描述

以上分区目录也可以在系统表“system.parts”中查询得到:

#在系统表 system.part中查询表 t_mt的分区信息:
select table ,partition ,name ,active from system.parts where table = ‘t_mt’;

进入到某一个分区目录片段“202102_2_2_0”中,我们可以看到如下目录:

在这里插入图片描述

对以上目录的解释如下:

1、checksums.txt:校验文件,使用二进制格式存储。它保存了余下各类文件(primary. idx、count.txt等)的size大小及size的哈希值,用于快速校验文件的完整性和正确性。

2、columns.txt: 存储当前分区所有列信息。使用明文格式存储。

[root@node1 202102_2_2_0]# cat columns.txt
columns format version: 1
5 columns:
id UInt8
name String
age UInt8
birthday Date
location String

3、count.txt:计数文件,使用明文格式存储。用于记录当前数据分区目录下数据的总行数。

[root@node1 202102_2_2_0]# cat count.txt
2

data.bin:数据文件,使用压缩格式存储,默认为LZ4压缩格式,用于存储某一列的数据。之前clickhoue版本是每一个列字段都拥有独立的.bin数据文件,并以列字段名称命名,在新版本ClickHouse中所有数据合并到data.bin中。
之前ClickHouse版本此目录数据如下:
在这里插入图片描述
4、data.mrk3:列字段标记文件,使用二进制格式存储。标记文件中保存了data.bin文件中数据的偏移量信息。

5、default_compression_codec.txt:存储数据压缩格式

6、partition.dat与minmax_[Column].idx:如果指定了分区键,则会额外生成partition.dat与minmax索引文件,它们均使用二进制格式存储。partition.dat用于保存当前分区下分区表达式最终生成的值,即分区字段值;而minmax索引用于记录当前分区下分区字段对应原始数据的最小和最大值。比如当使用birthday字段对应的原始数据为2021-02-17、2021-02-23,分区表达式为PARTITION BY toYYYYMM(birthday),即按月分区。partition.dat中保存的值将会是202102,而minmax索引中保存的值将会是2021-02-17、2021-02-23。

7、primary.idx:一级索引文件,使用二进制格式存储。用于存放稀疏索引,一张MergeTree表只能声明一次一级索引,即通过ORDER BY或者PRIMARY KEY指定字段。借助稀疏索引,在数据查询的时能够排除主键条件范围之外的数据文件,从而有效减少数据扫描范围,加速查询速度。

三、数据标记的工作机制和数据查询

1、索引和主键

在这里插入图片描述
在这里插入图片描述

2、数据标记的工作机制在这里插入图片描述在这里插入图片描述
2、数据查询
  1. 确定分区(如果有)
  2. 根据primary.idx确定数据数据在哪些索引标记内。
  3. 根据索引标记和数据标记文件(.mrk或.mrk2)确定数据在哪个压缩数据块,以及在解压缩数据块中的偏移量
  4. 加载数据至内存,向量化操作、查询过滤。 ​

在这里插入图片描述

二、ReplicatedMergeTree

只有MergeTree系列引擎支持数据副本,支持副本的引擎是在MergeTree引擎名称的前面加上前缀Replicated,也就是ReplicatedMergeTree。副本是表级别的而不是整个服务器级别的,因此,
服务器可以同时存储复制表和非复制表。
1、和zookeeper的整合
1)ClickHouse使用Apache ZooKeeper来存储副本元信息, 在配置文件设置zookeeper相关的参数。
如果ClickHouse的配置文件未配置ZooKeeper,则无法创建复制表,并且任何存量的复制表都将是只读的。
2)对本地复制表的查询不会使用ZooKeeper, 其查询速度和非复制表一样快。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python水果分类字典构建指南

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、理解需求 三、构建字典 1. 数据结构选择 2. 代码实现 3. 结果展示 四、总…

C++实现基础二叉搜索树(并不是AVL和红黑树)

本次实现的二叉搜索树并不是AVL数和红黑树,只是了解流程和细节。 目录 二叉搜索树的概念K模型二叉搜索树的实现二叉搜索树的架构insert插入find 查找中序遍历Inorder删除earse替换法的思路情况一 :假如要删除节点左边是空的。在左边时在右边时 情况二&a…

JavaScript-数组的增删改查

数组的操作一共有四种: 查询数组数据修改数组中元素的值数组添加新的数据删除数组中的元素 数组的初始化 有些编程语言的数组初始化是用{}包着的,而JS的数组初始化用[] let num[2,6,1,77,52,25,7]; 数组的查询 想要具体查询数组中的某个元素 可以用数…

【Spring Cloud】全面解析服务容错中间件 Sentinel 持久化两种模式

文章目录 推送模式本地文件持久化(拉模式)配置yml编写处理类添加配置演示 配置中心持久化(推模式)修改nacos在sentinel中生效引入依赖配置文件 修改sentinel在nacos中生效下载源码更改代码演示 总结 推送模式 Sentinel 规则的推送…

【JavaEE 初阶(十)】JVM

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多进阶知识 目录 1.前言2.JVM内存区域划分3.类加载3.1双亲委派模型 4.垃圾回收(GC&#xff0…

结构体变量的创建和初始化以及内存对齐

前言 嗨,我是firdawn,在本章中我们将介绍,结构体变量的创建和初始化,结构成员访问操作符以及结构体的内存对齐,下面是本章的思维导图,接下来,让我们开始今天的学习吧! 一&#xf…

下载CentOS系统或者下载Ubuntu系统去哪下?

因为Centos官网是挂在国外的服务器上,下载镜像时相比于国内的下载速度会慢很多,分享国内的镜像站去阿里巴巴下载Centos镜像。 首先分享两种下载方式,如果只想下载Centos那么就访问方式一的下载地址即可,如果还想下载其他的系统&a…

AI大模型探索之路-实战篇5: Open Interpreter开放代码解释器调研实践

系列篇章💥 AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践 目录 系列篇章💥前言一、何为Open Interpreter?二、与 ChatGPT 的代码解释器比较三、 Open Interpreter的特性1、强大的本地计算能力2、丰富的功能3、高度的…

基于springboot+vue的招聘信息管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

生产物流智能优化系统

对生产调度、物流调度【车辆路径问题、配送中心拣选问题】智能优化算法研究形成系统性程序,逐步开发设计一个智能优化系统【包括:问题说明、实验界面、算法结构和算法程序应用说明】, 当前完成TSP和集送车辆路径的算法程序,程序效…

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发,确定业务目的和目标,将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果,通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…

Java进阶学习笔记8——单继承、Object类、方法重写

Java 是单继承的,Java中的类不支持多继承,但是支持多层继承。 Object类是所有类的父类。 Java不支持多类继承: Java支持多层继承: 反证法: Object类: Object类是java所有类的祖宗类,我们写的任…

Excel中Lookup函数

#Excel查找函数最常用的是Vlookup,而且是经常用其精确查找。Lookup函数的强大之处在于其“二分法”的原理。 LOOKUP(查找值,查找区域(Vector/Array),[返回结果区域]) 为什么查找区域必须升序/…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题:大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

内网(极空间)搭建gitlab跳板机转发端口及域名配置

背景说明 https://blog.csdn.net/GodDavide/article/details/139182475 上文说到: 我已经用docker搭好了gitlab-ce服务,但我是部署在自己的家庭nas-极空间z4pro里的,属于内网环境。 另外我有一台阿里云服务器,做跳板机。 我有一个阿里的域名…

跟TED演讲学英文:Bring on the learning revolution! by Sir Ken Robinson

Bring on the learning revolution! Link: https://www.ted.com/talks/sir_ken_robinson_bring_on_the_learning_revolution Speaker: Sir Ken Robinson Date: February 2010 文章目录 Bring on the learning revolution!IntroductionVocabularySummaryTranscriptAfterword I…

基于DdddOcr通用验证码离线本地识别SDK搭建个人云打码接口Api

前言 最近介绍了一款免费的验证码识别网站,识别效率太低,考虑到ddddocr是开源的,决定搭建搭建一个,发现原作者sml2h3已经推出好久了,但是网上没有宝塔安装的教程,于是本次通过宝塔搭建属于自己的带带弟弟OCR通用验证码离线本地识别 原项目地址:https://github.com/sml2…

Project Reactor 响应式编程

Project Reactor 响应式编程 什么是响应式编程 响应式编程(Reactive Programming)是一种编程范式,致力于处理异步数据流和变化。它的核心思想是构建响应于变化的系统,即当数据流或事件发生变化时,系统能够自动地调整…

【研发日记】【策划向】(一)游戏策划其实就是一道加减法题

文章目录 序设计的过程其实是控制自己欲望的过程我海纳百川,你要不要看看?我跟别人不一样!我的人设就是没有人设,或者说任何人设都是我的人设 记 序 不知不觉进入这个行业几年了,也经历了独立开发和团队开发的过程。在…

【第1章】SpringBoot入门

文章目录 前言一、版本要求1. SpringBoot版本2. 其他2.1 System Requirements2.2 Servlet Containers2.3 GraalVM Native Images 3. 版本定型 二、新建工程1.IDEA创建 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)2. 官方创建 三、第一个SpringBoot程序1. 引入web2. 启动类3. 启动…