【ClickHouse】

news2024/11/14 14:34:26

文章目录

  • 一、表引擎
    • 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)

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

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

相关文章

U盘无法格式化?试试这几种快速有效的方法!

我们在通过Windows文件资源管理器、磁盘管理或Diskpart命令格式化U盘过程中,会遇到Windows无法格式化U盘。导致出现该问题的原因可能有以下几种: U盘被病毒和恶意软件感染; U盘有坏道; U盘已经物理损坏; 1.消除可能…

数据类型的陷进,从表象看本质!

哪些值转为布尔值为false 1、undefined(未定义,找不到值时出现) 2、null(代表空值) 3、false(布尔值的false,字符串"false"布尔值为true) 4、0(数字0&…

LeetCode每日一题之209长度最小的子数组

文章目录 问题描述方法一:暴力求解方法二:滑动窗口 问题描述 方法一:暴力求解 暴力求解法:时间复杂度O(n^2),空间复杂度O(1)。 暴力求解法的思想:每一次遍历数组,然后更新result的值&#xff0…

【Linux基本指令(3)】几十条指令快速入手Linux/到底什么是日志?/指令的运行原理到底是什么?

本文思维导图: 文章目录 13.head指令14.tail指令15.时间相关指令到底什么是日志?时间戳 16.cal指令17.find指令(非常重要)18.grep指令19.zip/unzip指令20.tar指令(非常重要)21.bc指令22.uname指令23.几个重…

香橙派4和树莓派4B构建K8S集群实践之六:虚拟主机

1. 说明 根据之前设置好的基础,我打算设置两种不同的虚拟主机运行在这个K8s集群上面,一个是LNMP体系的WebApp,一个是Java SpringBoot体系的WebApp。 1.1 设置表格 - wwwroot 是之前做pvc定义的文件目录,形如:/data0…

外包没有前途的,已经被替换了....

我25岁的时候,外包测试,薪资13.5k,人在深圳。 内卷什么的就不说了,而且人在外包那些高级精英年薪大几十的咱也接触不到,就说说外包吧。假设以我为界限,25岁一线城市13.5k,那22-24大部分情况下是…

花指令问题

前言 想起之前打题的时候经常会遇到一些关乎花指令的问题,但是没有系统地总结归纳花指令去除的姿势,浅浅开一个坑慢慢来写 题1:简单jmp 可以骗过dbg,但是放在ida中就很容易看出来,无效跳转 题目来源:[HD…

七牛云图床设置

文章目录 七牛云图床设置下面是用picgo配置图床SSL证书申请https网站显示http图片解决方案 原文链接图床设置,免费SSL证书申请,https网站显示http链接的图片 七牛云图床设置 登录七牛云官网并进行个人注册,然后找到对象存储 点击空间管理&a…

一种适用于大量租户大量角色权限系统设计

前言 权限管理是每个系统不可缺少的一部分,大部分开发者应该都设计过权限管理系统,很多开发者学习的第一个项目可能就是权限管理系统。但是常见的权限设计在租户量非常大、角色数量非常多时会存在角色权限表数据量指数增长的情况,本文介绍一…

c++代码手撕红黑树

企业里永远是技术驱动理论发展 比起理解红黑树的原理,更重要的是理解红黑树的应用场景,因为某些应用场景的需要,红黑树才会应运而生。 红黑树的特点: 插入,删除,查找都是O(logn)的复杂度。 红黑树的应用…

【lager】日志系统2:测试程序调试

design 官方设计文档 design cmakelist增加plog构建 cmake_minimum_required(VERSION 3.1.3 FATAL_ERROR) project(Lager)set(CMAKE_CXX_STANDARD 11) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)find_package(

课时八——进程同步(二)

1、信号量 信号量机制是一种功能较强的机制,可用来解决互斥和同步问题,它只能被两个标准的原语wait(S)(P操作)和signal(S)(V操作 )访问。 注意:原语是一种特殊的程序段,其执行只能一…

EV 电动汽车远程监控系统

EV 电动汽车远程监控系统 远程监控系统简介 目录 EV 电动汽车远程监控系统 1、远程监控系统是什么? 2、远程监控系统包含什么? 2.1车载终端 2.2、数据服务器 ​​​​​​​ 2.3、监控页面 3、远程监控系统有什么用? 4、车载终端…

中性市场观下,贝壳驶入长期价值之海

(图片来源于网络,侵删) 文 | 螳螂观察 作者 | 易不二 2023年一季度,房地产市场实现了久违的回暖。 国家统计局公布的数据显示,2023年1-4月,全国商品房销售额39750亿元,增长8.8%,…

Atlassian数据迁移攻略:迁移前必备须知

到2024年2月,Atlassian将终止对Server产品及插件的所有支持。是时候制定您的迁移计划了——Atlassian为您提供两种迁移选择,一是本地部署的数据中心版本,中国用户25人以上即可使用,二是云版。作为Atlassian全球白金合作伙伴&#…

es Elasticsearch 六 java api spirngboot 集成es

目录 Java restApi Springboot 集成es 新增-同步 新增-异步 增删改查流程 _bulk 批量操作 Java restApi Springboot 集成es 新增-同步 Testpublic void te2() throws IOException {System.out.println(1);IndexRequest ir new IndexRequest("test");ir.id(&qu…

STM8 模拟iic接口调试温湿度传感器SHT3x驱动

背景 项目实际使用SHT3x进行温湿度测量,主控芯片采用STM8S003F3P6,并且使用模拟IIC接口的硬件连接。 原理图 如下图所示,使用STM8S003F3P6管脚PB4/PB5进行SHT3x数据接口 SHT3x-DIS是Sensirion新一代的温湿度传感器,精度为2%RH和…

LCD1602介绍和各报错经验总结

LCD ( Liquid Crystal Display 的简称)液晶显示器。能够同时显示16x2,32个字符,是一种专门用来显示字母、数字、符号等的点阵型液晶模块。 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏&#x…

【十字绣】传统手艺-微信小程序开发流程详解

还记得小时候看过母亲的十字绣吗,易学易懂,就是用专用的绣线和十字格布,通过平面坐标计找出位置,对照专用的图案进行刺绣,可作出心中所想的画,奈何所需材料成本不小,这里用小程序简单模拟十字绣…

HCIA——VLAN

目录 1,什么是VLAN: 2,如何实现VLAN: 3,VLAN的划分方式: 4,交换机接口类型: 1,Access接口: 2,Trunk接口:允许将一个接口划分给多…