Clickhouse学习笔记(3)—— Clickhouse表引擎

news2024/11/20 0:28:27

前言:

有关Clickhouse的前置知识详见:

1.ClickHouse的安装启动_clickhouse后台启动_THE WHY的博客-CSDN博客

2.ClickHouse目录结构_clickhouse 目录结构-CSDN博客


Cickhouse创建表时必须指定表引擎

表引擎(即表的类型)决定了:

  • 数据的存储方式和位置,写到哪里以及从哪里读取数据

数据一般存储在本地,默认路径是/var/lib/clickhouse/

除此之外也可以集成一些外部的数据库,如Hive,MySQL等

  • 支持哪些查询以及如何支持

数组在mergetree引擎中无法使用

  • 并发数据访问
  • 索引的使用(如果存在)
  • 是否可以执行多线程请求
  • 数据复制参数

TinyLog

以列文件的形式保存在磁盘上,不支持索引,没有并发控制。一般保存少量数据的小表,生产环境上作用有限。可以用于平时练习测试用

Memory

内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。读写操作不会相互阻塞,不支持索引。简单查询下有非常非常高的性能表现(超过 10G/s)。

一般用到它的地方不多,除了用来测试,就是在需要非常高的性能,同时数据量又不太大(上限大概 1 亿行)的场景

MergeTree*(合并树)

MergeTree支持索引和分区

建表语句如下:

create table t_order_mt(id UInt32, sku_id String, total_amount Decimal(16,2), create_time Datetime)engine = MergeTree partition by toYYYYMMDD(create_time) primary key(id) order by (id,sku_id);

需要注意的是,clickhouse中主键会自动创建索引,但并不唯一;

而且order by设置的排序是在分区内排序

插入数据

insert into t_order_mt values \
(101,'sku_001',1000.00,'2020-06-01 12:00:00') ,\
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),\
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),\
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',600.00,'2020-06-02 12:00:00');

进行查询:

可以看到通过命令行查询出的数据可以明显观察到分区

语法知识

MergeTree | ClickHouse Docs

可以看到,primary key 和 partition by字段都不是必须的,但order by字段是必须的

分区合并

分区的目的主要是降低扫描的范围,优化查询速度

在hive中,分区是通过HDFS中分目录实现的;clickhouse中也是通过分目录实现的,只不过是在本地磁盘

MergeTree 是以列文件+索引文件+表定义文件组成的,但是如果设定了分区那么这些文件就会保存到不同的分区目录中

具体操作

向表中插入数据:

在本地按分区存储数据:

再次插入数据:

可以看到数据并没有纳入任何分区,这是因为任何一个批次的数据写入都会产生一个临时分区,不会纳入任何一个已有的分区;写入后的某个时刻(大概 10-15 分钟后),ClickHouse 会自动执行合并操作

也可以手动通过 optimize 执行,把临时分区的数据,合并到已有分区中:

optimize table xxxx final

详细语法见:OPTIMIZE Statement | ClickHouse Docs

查看数据文件可以看到合并后的分区数据:

可以看到最小分区块编号、最大分区块编号和合并层级都发生了变化

需要注意:手动执行分区合并后会生成新的数据文件,但过期数据不会立即删除

等到自动合并操作执行后,过期数据就会被删除了;因此过一段时间再去查看:

除此之外,optimize还可以指定要合并的分区:

optimize table xxxx PARTITION partition final;

示例:

插入一些数据,目前的分区如下:

接下来只合并分区id为20200601的数据:

optimize table t_order_mt partition '20200601' final;

合并结果如下:

primary key

MergeTree | ClickHouse Docs

  • 只提供了数据的一级索引,但是却不是唯一约束
  • 主键的设定主要依据是查询语句中的 where 条件,根据条件通过对主键进行某种形式的二分查找,能够定位到对应的 index granularity避免了全表扫描

index granularity:索引粒度;也就是在稀疏索引中两个相邻索引对应数据的间隔。ClickHouse 中的 MergeTree 默认是 8192;官方不建议修改这个值,除非该列存在大量重复值,比如在一个分区中几万行才有一个不同数据

稀疏索引的好处就是可以用很少的索引数据,定位更多的数据,代价就是只能定位到索引粒度的第一行,然后再进行进行一点扫描

order by

  • order by进行分区内排序,是必须设置的(因为clickhouse使用稀疏索引,如果数据无序,无法根据索引来进行定位)
  • 主键必须是 order by 字段的前缀字段

比如 order by 字段是 (id,sku_id) 那么主键必须是 id 或者(id,sku_id)

假如主键是sku_id,那么可以发现数据在主键维度上是无序的,索引依然无法定位

二级索引

clickhouse从v20.1.2.4 开始全面支持二级索引

创建二级索引的语法:

INDEX a total_amount TYPE minmax GRANULARITY 5

索引名 对应的列 二级索引的类型 粒度

注意:这里的粒度指的是二级索引相对于一级索引的粒度

测试

建表

create table t_order_mt2( \
 id UInt32,\
 sku_id String,\
 total_amount Decimal(16,2),\
 create_time Datetime,\
INDEX a total_amount TYPE minmax GRANULARITY 5\
) engine =MergeTree\
 partition by toYYYYMMDD(create_time)\
 primary key (id)\
 order by (id, sku_id);

插入数据:

insert into t_order_mt2 values \
(101,'sku_001',1000.00,'2020-06-01 12:00:00') ,\
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),\
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),\
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',600.00,'2020-06-02 12:00:00');

测试二级索引是否发挥作用:

clickhouse-client --send_logs_level=trace <<< 'select * from t_order_mt2 where total_amount > toDecimal32(900., 2)';

可以看到:

index a在查询过程中起到了粒度划分的作用;

TTL

MergeTree | ClickHouse Docs

TTL 即 Time To Live,MergeTree 提供了可以管理数据表或者列的生命周期的功能

对于表和列都可以指定TTL;

指定列的TTL(建表时)

TTL time_column + interval

建表测试:

create table t_order_mt3(\
 id UInt32,\
 sku_id String,\
 total_amount Decimal(16,2) TTL create_time+interval 10 SECOND,\
 create_time Datetime \
) engine =MergeTree\
partition by toYYYYMMDD(create_time)\
 primary key (id)\
 order by (id, sku_id);

total_amount列设置了TTL

插入数据:

insert into t_order_mt3 values \
(106,'sku_001',1000.00,'2023-07-31 20:45:10'),\
(107,'sku_002',2000.00,'2023-07-31 20:45:10'),\
(110,'sku_003',600.00,'2023-07-31 20:45:10');

插入完成后可以正常查询到数据:

等待到20:45:20之后再次查询:

发现依然能查询到数据:

可能是因为尚未合并导致的,因此手动合并:

optimize table t_order_mt3 final

发现字段值已经清空:


如果没有反应,可以尝试重启以下clickhouse的服务器,因为TTL操作是单独开启一个进程去完成的,如果机器资源较少,可能出现应答不及时的情况;

修改列的TTL

语法:

通过MODIFY COLUMN实现,简单来说就是重新定义一下这个列;

指定表的TTL

语法:

就是在ORDER BY后面设置TTL即可

官网给出了TTL到达后的三种策略

DELETE:删除对应数据

TO DISK 'aaa':将数据移动到磁盘'aaa'

TO VOLUME 'bbb':将数据移动到磁盘'bbb'

修改表的TTL

语法:

ReplacingMergeTree(去重)

ReplacingMergeTree 是 MergeTree 的一个变种,它存储特性完全继承 MergeTree,只是

多了一个去重的功能(根据order by字段进行去重,而不是主键)

去重时机:数据的去重只会在合并的过程中出现(合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理)

在新版本中插入数据时会先进行一次去重

去重范围:分区内去重,无法跨分区去重

测试

创建表,指定引擎为ReplacingMergeTree

create table t_order_rmt(\
 id UInt32,\
 sku_id String,\
 total_amount Decimal(16,2) ,\
 create_time Datetime \
) engine =ReplacingMergeTree(create_time)\
 partition by toYYYYMMDD(create_time)\
 primary key (id)\
 order by (id, sku_id);

ReplacingMergeTree() 填入的参数为版本字段,重复数据保留版本字段值最大的

如果不填版本字段,默认按照插入顺序保留最后一条

插入数据:

insert into t_order_rmt values\
(101,'sku_001',1000.00,'2020-06-01 12:00:00') ,\
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),\
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),\
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',600.00,'2020-06-02 12:00:00');

查询结果如下:

与下图对比可知在插入数据时已经进行了去重

注意到有两条数据的版本字段相同:

最终保留的数据是:

因此可以看到,但版本字段相同时,按照插入顺序保留最后一条


接下来再次插入数据,查询结果如下:

可以看到同一分区内的数据并未进行去重

因此手动执行合并后再查询:

可以看到已经进行了去重;

SummingMergeTree(聚合)

适用于不查询明细,只关心以维度进行汇总聚合结果的场景,可以避免因临时聚合而带来的开销

测试

创建表,指定引擎为SummingMergeTree

create table t_order_smt(\
 id UInt32,\
 sku_id String,\
 total_amount Decimal(16,2) ,\
 create_time Datetime \
) engine =SummingMergeTree(total_amount)\
 partition by toYYYYMMDD(create_time)\
 primary key (id)\
 order by (id,sku_id );

注意,SummingMergeTree()中的字段为聚合字段,即在哪一维度上进行聚合,这里指定的是total_amount,也可以指定多个字段,但必须是数值类型;

如果不填,以所有非维度列且为数字列的字段为汇总数据列

插入数据:

insert into t_order_smt values\
(101,'sku_001',1000.00,'2020-06-01 12:00:00'),\
(102,'sku_002',2000.00,'2020-06-01 11:00:00'),\
(102,'sku_004',2500.00,'2020-06-01 12:00:00'),\
(102,'sku_002',2000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',12000.00,'2020-06-01 13:00:00'),\
(102,'sku_002',600.00,'2020-06-02 12:00:00');

查询结果如下:

首先可以发现,SummingMergeTree是以order by的列作为维度列进行聚合的,而且是分区内聚合

同时可以看到,同一分区内的相应数据已经进行了聚合:

                                                                        👇

除了维度列和聚合字段之外,create_time这一列保留最早插入的一行;


再次插入数据进行测试:
可以看到并未进行聚合:

这是因为SummingMergeTree和ReplacingMergeTree一样,都是只有在同一批次插入(新版本)或分片合并时才会进行聚合

因此手动执行合并:optimize table t_order_smt final

可以看到成功聚合:

根据聚合表的特性,在实际开发中设计聚合表时,唯一键值、流水号可以去掉,所有字段全部是维度、度量或者时间戳

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

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

相关文章

【MATLAB源码-第75期】基于模拟退火算法(SA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 模拟退火算法是一种启发式优化算法&#xff0c;通常用于解决组合优化问题&#xff0c;例如旅行商问题和图着色问题。它模拟了固体材料在退火过程中逐渐冷却达到稳定状态的行为&#xff0c;以寻找问题的全局最优解。 以下是模…

【MATLAB源码-第76期】基于模拟退火算法(SA)的无人机三维地图路径规划,输出最短路径和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 模拟退火算法是一种启发式优化算法&#xff0c;通常用于解决组合优化问题&#xff0c;例如旅行商问题和图着色问题。它模拟了固体材料在退火过程中逐渐冷却达到稳定状态的行为&#xff0c;以寻找问题的全局最优解。 以下是模…

Unity 场景优化策略

Unity 场景优化策略 GPU instancing 使用GPU Instancing可以将多个网格相同、材质相同、材质属性可以不同的物体合并为一个批次&#xff0c;从而减少Draw Calls的次数。这可以提高性能和渲染效率。 GPU instancing可用于绘制在场景中多次出现的几何体&#xff0c;例如树木或…

软件工程的舞台上,《人月神话》的美学纷飞

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天给大家分享一本书&#xff1a;《人月神话》——软件工程的经典之作。 《人月神话》是一本具有深远影响力的软件工程著作&#xff0c;无论是软件开发者、管理者还是学习软件工程的人士&#xff0c;都能从中获得宝贵的启…

电脑想要微信多开——打开多个微信的必胜法宝!

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.11.11 Last edited: 2023.11.11 导读&#xff1a;在生活当中经常遇到工作和生活相撞的事情&#xff0c;导致在处理私人的事情同时不得不处理…

redis学习指南--概览篇

redis怎么学 官方学习网站&#xff1a; redis.cn 1、整体了解redis redis是一个内存数据库、kv数据库&#xff0c;数据结构数据库&#xff0c;redis中数据都是存储在redis中&#xff0c;可以通过key查找value&#xff0c;value可以有多种数据结构&#xff0c;有&#xff1a;…

牛客、赛码网OJ调试(全)

现在无论开发还是测试&#xff0c;面试的时候都需要考察代码能力。 从测试的职业发展来看&#xff0c;现在市场上对于纯功能测试的需求很少&#xff0c;招聘方均要求面试者一方面具备测试基础能力&#xff0c;也要求有点代码能力。 对于测试来说&#xff0c;除了测试开发&#…

C语言计算字符串中数字字符的个数

文章目录 1-9题前言例题10例题11答案例题10答案答案1答案2 例题11答案 1-9题 C语言基础例题1-3题-指针篇 C语言基础例题4-5题-二维数组篇 C语言基础例题6-7题-结构体篇 C语言基础例题8-9题-大作业篇 前言 下列题目需要学习字符串、指针后才可练习。 例题10 请编写一个程序…

【Java】I/O流—转换流、序列化流的初学者指南及RandomAccessFile类

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;我不在意你曾堕落&#xff0c;我只在意你是否会崛起 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录…

【算法与设计模式】

一、数据结构与算法 1、算法性能评估 时间复杂度、空间复杂度 2、数据结构 数组与列表 队列 堆栈 链表 二叉树 多叉树 递归算法 二、设计模式 1、单例 &#xff08;1&#xff09;GIL&#xff1a;线程互斥锁。保证同一时刻只有一个线程在进行。 &#xff08;2&#xff09…

嵌入式CTS测试

1.概述 CTS是一套开源测试套件&#xff0c;可以实现对OpenGL、ES、OpenCL、Vulkan的兼容性测试。OpenGL ES CTS的测试集&#xff0c;其测试用例涵盖了各种OpenGL ES 的功能和特性。这些功能包括着色器编译和链接、图元绘制、纹理操作、帧缓冲操作、深度测试、模板测试以及其他一…

中国智能驾驶的“突围赛”打响,这家本土厂商为何能成为“先行者”?

中国本土厂商正在成为全球智能汽车产业链的“核心力量”。 根据《高工智能汽车研究院》数据显示&#xff0c;今年1-6月&#xff0c;自主品牌标配L2&#xff08;含L2&#xff09;级辅助驾驶交付新车155.34万辆。其中&#xff0c;搭载中国本土智能驾驶解决方案提供商&#xff08…

Clickhouse 学习笔记(6)—— ClickHouse 分片集群

前置知识&#xff1a; Clickhouse学习笔记&#xff08;5&#xff09;—— ClickHouse 副本-CSDN博客 与副本对比&#xff1a; 副本虽然能够提高数据的可用性&#xff0c;降低丢失风险&#xff0c;但是每台服务器实际上必须容纳全量数据&#xff0c;对数据的横向扩容没有解决 …

自适应AI chatGPT智能聊天创作官网html源码/最新AI创作系统/ChatGPT商业版网站源码

源码简介&#xff1a; 自适应AI chatGPT智能聊天创作官网html源码&#xff0c;这是最新AI创作系统&#xff0c;作为ChatGPT商业版网站源码&#xff0c;它是支持创作、编写、翻译、写代码等。是一个智能聊天系统项目源码。 注意&#xff1a;这个只是网站html源码&#xff0c;要…

leetcode 刷题 - 有效三角形个数 - 长度最小的子数组 - 无重复字符的最长子串

l611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1:输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示…

【vue】vue项目批量下载二维码,且打包成压缩包.

一. 先看效果演示 二. 下插件 npm i vue-qr -S // 二维码显示插件 我的版本^4.0.9 npm i html2canvas -S // 将二维码转为图片 我的版本^1.4.1 npm i file-saver -S // 下载图片 我的版本^2.0.5 npm i jszip -S // 打包成压缩包 我的版本^3.10.1 // 一次性下载 npm i vue-qr h…

利用中断做数码表

功能要求:1.按下KEY1&#xff0c;显示数字开始每0.5秒加1&#xff0c;加到&#xff08;10学号&#xff09;返回0&#xff0c;0显示2秒后继续开始重复加1。 2. 任何时候按下KEY2数字清零&#xff0c;并停止加1。 3. KEY1和KEY2分别采用查询和外部中断方式。 要求程序中有硬件…

最新宝塔面板第三方云端站点程序源码/第三方宝塔面板PHP源码/全开源ThinkPHP框架

源码简介&#xff1a; 实现宝塔面板第三方云端站点程序源码,这个是第三方宝塔面板 btcloud PHP源码&#xff0c;它还有云端使用记录、IP黑白名单、定时任务等功能。 这是一个使用PHP开发的宝塔面板第三方云端站点程序。 您可以利用此程序搭建属于自己的宝塔面板第三方云端&a…

Springboot+vue的高校办公室行政事务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校办公室行政事务管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的高校办公室行政事务管理系统&#xff0c;采用M&#xff08;m…

九种常用二次曲面的构造过程

九种常用二次曲面的构造过程 1.九种常用二次曲面的构造过程1.1 椭圆锥面1.2 椭球面1.3 单叶双曲面1.4 双叶双曲面1.5 椭圆抛物面1.6 双曲抛物面&#xff08;马鞍面&#xff09;1.7 椭圆柱面1.8 双曲柱面1.9 抛物柱面 1.九种常用二次曲面的构造过程 声明&#xff1a;部分截图来自…