【ClickHouse】

文章目录

  • 一、表引擎
    • 1、表引擎的作用
    • 2、TinyLog
    • 3、Memory
    • 4、MergeTree
    • 二、数据库引擎
    • 1、作用--跨种类交换数据
    • 2、示例
  • 三、MergeTree引擎
    • 1、简单使用
    • 2、分区partition by
    • 3、主键primary key
    • 4、order by(必填)

一、表引擎

1、表引擎的作用

CK表引擎决定了如何存储表的数据。包括:

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

➢ 支持哪些查询以及如何支持。

➢ 并发数据访问。

➢ 索引的使用(如果存在)。

➢ 是否可以执行多线程请求。

➢ 数据复制参数。

表引擎的使用方式就是必须显式在创建表时定义该表使用的引擎,以及引擎使用的相关参数。

特别注意:==引擎的名称大小写敏感==

2、TinyLog

  • 以列文件的形式保存在磁盘上
  • 不支持索引
  • 没有并发控制
  • 一般保存少量数据的小表,产环境上作用有限。可以用于平时练习测试用
create table t_tinylog ( id String, name String) engine=TinyLog;

3、Memory

  • 内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失
  • 读写操作不会相互阻塞,不支持索引
  • 简单查询下有非常非常高的性能表现(超过 10G/s)
  • 常用于测试、在需要非常高的性能,同时数据量又不太大(上限大概 1 亿行)的场景场景

4、MergeTree

  • ClickHouse 中最强大的表引擎当属 MergeTree(合并树)引擎及该系列(*MergeTree)中的其他引擎
  • 支持索引和分区
  • 地位可以相当于 innodb 之于 Mysql
  • 基于 MergeTree还衍生出了很多小弟,即*MergeTree系列

二、数据库引擎

1、作用–跨种类交换数据

除了表引擎,CK还有数据库引擎,如MySQL引擎

MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERTSELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换

CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')

- host:port — MySQL服务地址
- database — MySQL数据库名称
- user — MySQL用户名
- password — MySQL用户密码

2、示例

CK支持的数据库引擎很多,这里以MySQL为例:先在MySQL中准备测试数据:

mysql> USE testDB;
Database changed

mysql> CREATE TABLE `mysql_table` (
    ->   `int_id` INT NOT NULL AUTO_INCREMENT,
    ->   `float` FLOAT NOT NULL,
    ->   PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)


mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)


mysql> select * from mysql_table;
+------+---------+
| int_id | value |
+------+---------+
|      1 |     2 |
+------+---------+
1 row in set (0,00 sec)

ClickHouse中的数据库,与MySQL服务器交换数据:

CREATE DATABASE mysql_db 
ENGINE = MySQL('localhost:3306', 'testDB', 'my_user', 'user_password')
SHOW DATABASES;
┌─name─────┐
│ default  │
│ mysql_db │
│ system   │
└──────────┘
SELECT * FROM mysql_db.mysql_table;
┌─int_id─┬─value─┐
│      12 │
└────────┴───────┘
INSERT INTO mysql_db.mysql_table VALUES (3,4);
SELECT * FROM mysql_db.mysql_table;

┌─int_id─┬─value─┐
│      12 │
│      34 │
└────────┴───────┘

三、MergeTree引擎

1、简单使用

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);

以上创建表时,使用MergeTree引擎,primary key和MySQL不同的是,该引擎的主键也会加索引,但却没有唯一性约束

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');

在这里插入图片描述

2、分区partition by

分区的目的主要是降低扫描的范围,优化查询速度。可选,不填则只有一个分区。

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

在这里插入图片描述

20200601_1_1_0含义解释:
PartitionId_MinBlockNum_MaxBlockNum_Level
分区值_最小分区块编号_最大分区块编号_合并层级
---------------
1)PartitionId
数据分区ID生成规则:
数据分区规则由分区ID决定,分区ID由PARTITION BY分区键决定。根据分区键字段类型,ID生成规则可分为:
- 未定义分区键:
  没有定义PARTITION BY,默认生成一个目录名为all的数据分区,所有数据均存放在all目录下。

- 整型分区键:
  分区键为整型,那么直接用该整型值的字符串形式做为分区ID。

- 日期类分区键:
  分区键为日期类型,或者可以转化成日期类型。

- 其他类型分区键:
  String、Float类型等,通过128位的Hash算法取其Hash值作为分区ID。
  
2)MinBlockNum
   最小分区块编号,自增类型,从1开始向上递增。每产生一个新的目录分区就向上递增一个数字。
    
3)MaxBlockNum
  最大分区块编号,新创建的分区MinBlockNum等于MaxBlockNum的编号。
  
4Level
   合并的层级,被合并的次数。合并次数越多,层级值越大。

并行:分区后,面对跨分区的查询统计,CK会一个线程处理一个分区,并行查

cd /var/lib/clickhouse
# data、metadata等目录中存在CK中的数据和元数据

cd /20200601_1_1_0
# bin文件:数据文件
# mrk文件:标记文件
# 标记文件在idx索引文件和bin数据文件之间起到了桥梁作用,以mrk2结尾的文件,表示启动了自适应索引间隔
# primary.idx文件:主键索引文件,用于加快查询效率
# minmax_create_time.id:分区键的最大最小值
# checksums.txt:校验文件,用于校验各个文件的正确性,存放各个文件的size以及hash值

数据写入与分区合并:任何一个批次的数据写入都会产生一个临时分区,不会纳入任何一个已有的分区。写入后的某个时刻(大概 10-15 分钟后),ClickHouse 会自动执行合并操作(等不及也可以手动通过 optimize 执行),把临时分区的数据,合并到已有分区中。

optimize table xxxx final;

继续再插入一遍上面的数据,查看分区效果:

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');

可以看到数据并没有合并:

在这里插入图片描述
分区目录长这样:

在这里插入图片描述
接下来手动执行合并:

optimize table t_order_mt final;

效果:

在这里插入图片描述

两个合并的目录就是过期数据了,后期会被清理掉。再看SQL中的效果:

在这里插入图片描述
最后,手动合并分区,还可以只选其中一个分区。如上面表中的两个分区,我只合并20200621分区

optimize table t_order_mt partitior '20200621' final;

3、主键primary key

CK中的主键,只提供了数据的一级索引,但是却不是唯一约束,即可以存在相同 primary key 的数据的。说CK主键的作用前,先了解下稀疏索引。

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

稀疏索引:

在这里插入图片描述

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

主键的设定主要依据是查询语句中的 where 条件。根据条件通过对主键进行某种形式的二分查找,能够定位到对应的 index granularity,避免了全表扫描。

4、order by(必填)

order by 设定了分区内的数据按照哪些字段顺序进行有序保存。

order by 是 MergeTree 中唯一一个必填项,因为当用户不设置主键时,很多操作要依靠order by的字段,比如索引查找、去重和汇总

主键必须是 order by 字段的前缀字段。

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

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

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

相关文章

智能运维应用之道,告别企业数字化转型危机

面临的问题及挑战 数据中心发展历程 2000 年中国数据中心始建,至今已经历以下 3 大阶段。早期:离散型数据中心 IT 因以项目建设为导向,故缺乏规划且无专门运维管理体系,此外,开发建设完的项目均是独立运维维护&#…

【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)

🎭不要管上面那玩意。。。 引入 现在,你,是一位酒店的经理。 西装笔挺,清瘦智慧。 金丝眼镜,黑色钢笔。 大理石的地板,黑晶石的办公桌,晶莹的落地玻璃。 而现在,有几个雍容华贵的…

智慧城市同城V4小程序V2.24独立开源版 + 全插件+VUE小程序开源前端+最新用户授权接口

智慧城市同城V4小程序V2.22开源独立版本月最新版,与上一版相比修复了一些小细节,功能本身并无大的变化。新版系统包含全插件、包括很多稀缺收费的插件都在里面如括招聘、 家政等,外加小程序的VUE开源前端,整个系统全开源&#xff…

机器学习 | 降维:PCA主成分分析

本文整理自 长路漫漫2021的原创博客:sklearn基础篇(九)-- 主成分分析(PCA)李春春_的原创博客:主成分分析(PCA)原理详解bilibili视频:用最直观的方式告诉你:什…

Python中模块的使用方法4

1 模块、包和库的区别 Python中,模块的英文是“module”,是一个以py为后缀名的文件;包的英文是“package”,是一个包含了多个模块的目录;库的英文是“library”,包含了具有相关功能的包和模块。 2 模块的…

web练习第二周

前言:(博主个人学习笔记,不用看)web练习第二周,仅做出前3题。相比于第一周,难度大幅增加,写题时就算看了wp还是像个无头苍蝇一样到处乱创,大多都是陌生知识点,工具的使用…

LeetCode刷题(ACM模式)-02链表

参考引用:代码随想录 注:每道 LeetCode 题目都使用 ACM 代码模式,可直接在本地运行,蓝色字体为题目超链接 0. 链表理论基础 0.1 链表定义 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成&#xff1a…

矿井水除总氮工艺详解

一、项目概述 项目背景: 1、水资源浪费长期以来,采煤对地下水造成了严重破坏。绝大部分矿井水,被以直排方式,流入河道、田野,这不仅造成水资源的白白浪费,也污染了环境。社会对此反响强烈的同时,煤矿企业也…

Live800:客服系统知识库建设中需要注意的三个要点

互联网的快速发展,让客服行业也随之发生着巨大的变化。传统的客服方式越来越难以满足人们的需求,客户对客服的要求也变得越来越高。在这种情况下,客服系统成为了一种必不可少的工具。 客服系统作为企业与客户沟通的重要渠道,其之所…

电脑msvcp120.dll缺失怎么办?由于找不到msvcp120.dll的解决方案

MSVCP120.dll文件是Windows操作系统中的一种动态链接库文件。它是由Microsoft C软件包提供的重要组件。当系统提示“MSVCP120.dll文件缺失”时,可能会导致某些应用程序无法正常运行。 以下是修复MSVCP120.dll缺失问题的几种方法: 方法一:修复…

ChatGPT发展报告:原理、技术架构详解和产业未来(附下载)

今年12月1日,OpenAI推出人工智能聊天原型ChatGPT,再次赚足眼球,为AI界引发了类似AIGC让艺术家失业的大讨论。 据报道,ChatGPT在开放试用的短短几天,就吸引了超过 100 万互联网注册用户。并且社交网络流传出各种询问或…

机试打卡 -12 滑动窗口最大值(优先队列堆)

我的思路1:队列,每次 出队入队,记录1个队列中的最大值索引,超时。。。 class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:nums_lenlen(nums)ans_list[]# 队列长度为kqueuenums[:k]# 队列最大…

花朵识别系统Python实现,深度学习卷积神经网络算法

一、背景 花朵识别系统,基于Python实现,深度学习卷积神经网络,通过TensorFlow搭建卷积神经网络算法模型,并对数据集进行训练最后得到训练好的模型文件,并基于Django搭建可视化操作平台。 在当今信息化社会&#xff0c…

我3年前写的博客,又被别人抄去发论文了,该论文整个正文部分几乎直接照抄我的博客

我想说每一篇原创博客都是作者的心血,有时候写一篇博客也许会花一天,甚至好几天的时间,尊重原创,营造好的环境,才有可能出现更多优质的博文,而不是到处都是抄来抄去的低质量水文。 前几天接到来自粉丝的私信…

如何通过CRM系统做好客户的分级分类

随着市场竞争的不断加剧,尤其是以客户为中心时代的到来,企业越来越注重客户的管理和服务。而CRM系统,作为企业客户管理的重要工具,其核心任务是对客户进行分级分类,以便更好地为客户提供定制化的服务。 客户之间的价值…

【C++】——模板(泛型编程+函数模板+类模板)

文章目录 1. 前言2. 泛型编程3. 函数模板3.1 函数模板的原理3.2 函数模板的实例化3.3 模板参数的匹配原则 4. 类模板4.1 类模板的实例化 5. 结尾 1. 前言 之前我们学习了函数重载,让我们在写相似函数的时候非常方便,但函数重载还有很多不足的地方&#…

【源码解析】Nacos配置热更新的实现原理

使用入门 使用RefreshScopeValue,实现动态刷新 RestController RefreshScope public class TestController {Value("${cls.name}")private String clsName;}使用ConfigurationProperties,通过Autowired注入使用 Data ConfigurationProperti…

如何从Ubuntu Linux中删除Firefox Snap?

Ubuntu Linux是一款广受欢迎的开源操作系统,拥有强大的功能和广泛的应用程序选择。默认情况下,Ubuntu提供了一种称为Snap的软件打包格式,用于安装和管理应用程序。Firefox是一款流行的开源网络浏览器,而Firefox Snap是Firefox的Sn…

f-stack的源码编译安装

DPDK虽然能提供高性能的报文转发(安装使用方法见DPDK的源码编译安装),但是它并没有提供对应的IP/TCP协议栈,所以在网络产品的某些功能场景下(特别是涉及到需要使用TCP协议栈的情况),比如BGP邻居…

9. Linux下实现简单的UDP请求

本文简单介绍了UDP传输层协议,并在Linux下实现简单的socket通讯 一、UDP UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它不保证数据包的可靠性和顺序。UDP在IP协议的基础上增加了简单的差错…