ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ClickHouse引擎

2021-07-24 11:34:31  阅读:243  来源: 互联网

标签:insert 数据 into 引擎 values tb id ClickHouse


表引擎:

一、日志引擎

创建表 引擎使用Log

create table tb_user(
id UInt8,
name String,
sal Float64,
address String,
birthday Date
) engine=Log;

  

 插入数据

insert into tb_user values(1,'zhangsan',20000,'shanghai','1986-09-08');

insert into tb_user values(2,'lisi',30000,'beijig','1987-09-08'), (3,'wangwu',40000,'beijig','1985-09-08');

 

每个字段以单独的文件存储

 

 sizes.json 记录每个 .bin 文件的大小。

__marks.mrk 记录数据的位置,保存块偏移量

*.bin 是按列保存数据的文件

 

创建表 使用TinyLog引擎

create table tb_user2(
id UInt8,
name String,
sal Float64,
address String,
birthday Date
) engine=TinyLog;

insert into tb_user2 values(1,'zhangsan',20000,'shanghai','1986-09-08');

insert into tb_user2 values(2,'lisi',30000,'beijig','1987-09-08'), (3,'wangwu',40000,'beijig','1985-09-08');

insert into tb_user2 values(4,'黄山',50000,'中国','1986-09-08');

  

查看文件结构,可以发现,少了__marks.mrk 文件

 

 

 

 创建表,使用StripeLog引擎

create table tb_user3(
id UInt8,
name String,
sal Float64,
address String,
birthday Date
) engine=StripeLog;

insert into tb_user3 values(1,'zhangsan',20000,'shanghai','1986-09-08');

insert into tb_user3 values(2,'lisi',30000,'beijig','1987-09-08'), (3,'wangwu',40000,'beijig','1985-09-08');

insert into tb_user3 values(4,'黄山',50000,'中国','1986-09-08');

  

查看文件结构,将所有的数据存储在data.bin 这一个文件中。

 

 

 

 

 StripeLog 引擎不支持ALTER UPDATE和ALTER DELETE.

 

二、MergeTree家族引擎

 1、MergeTree:

 MergeTree系列的表引擎是CK数据存储功能的核心,它们提供了用于弹性和高性能

数据检索的大多数功能: 列存储,自定义分区,稀疏的主索引,辅助数据跳过索引等。

  MergeTree: 

  数据的更新

  数据的排序

  快速查询

  建立索引

  分区

  自动的合并     去重    局部聚合

 

create table tb_mt(

  id Int8,

  name String,

  addr String

)

engine=MergeTree()

ORDER BY id ;

排序字段为id,默认是主键

 

insert into tb_mt values(1,'zhangsan','hz'),(5,'lisi','shanghai');

insert into tb_mt values(2,'wangwu','BeiJing'),(3,'zhaoliu','guanzhou');

 

查询数据 select * from tb_mt;

 查看文件夹结构 

cd  /var/lib/clickhouse/data/dbtest/tb_mt

 

 

进入all_1_1_0

 

 count.txt 是数据的数量,这里是2

columns.txt 是数据的列

 

 primary.idx 记录主键和索引

 

人为对分区数据进行合并

optimize table tb_mt;

 

 合并后数据是有序的。

 

查看结构,多了一个文件夹 all_2_2_0

 

 

去重功能

分别插入两条重复的数据

insert into tb_mt values(1,'zhangsan','hz');

insert into tb_mt values(1,'zhangsan','hz');

 

查询数据 select * from tb_mt;

 

 可以发现,主键id是允许重复的。

 

合并后查询

optimize table tb_mt;

 可以发现,数据没有去重。

 

指定分区合并

创建表,按addr进行分区

create table tb_mt2(
  id Int8,
  name String,
  addr String
)
engine=MergeTree()
ORDER BY id
partition by addr;

 

插入数据

insert into tb_mt2 values(1,'zhangsan','hz'),(3,'lisi','shanghai');

insert into tb_mt2 values(2,'wangwu','hz'),(4,'zhaoliu','shanghai');

 

select * from tb_mt2 ;

 

可以发现,没有按addr进行分区。查看文件结构,有四个分区。

 

 以上四个分区,一定时间阈值,会进行自动合并。

 

手工合并 optimize table tb_mt2; 然后进行查询select * from tb_mt2;,一次只能合并一个分区。

 

 

再合并一次optimize table tb_mt2,可以发现都合并好了。

 

 

 查看结构,1和3进行合并,2和4进行合并。

cd  /var/lib/clickhouse/data/dbtest/tb_mt2

 

 以后如果用分区addr进行查询,速度就会很快。

 

2、ReplacingMergeTree引擎

这个引擎实在MergeTree的基础上,添加了“处理重复数据”的功能。该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会再合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先做出计划。有一些数据可能仍未被处理。因此,ReplacingMergeTree适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。

创建表

create table tb_rep_merge_tree(
 id Int8,
 name String,
 ctime Date,
 version UInt8
)
engine=ReplacingMergeTree(version)
order by id
partition by name
primary key id;

  

插入数据

insert into tb_rep_merge_tree values(1,'a','2021-07-20',20);
insert into tb_rep_merge_tree values(1,'b','2021-07-20',30);
insert into tb_rep_merge_tree values(1,'a','2021-07-20',20);
insert into tb_rep_merge_tree values(1,'a','2021-07-20',30);
insert into tb_rep_merge_tree values(1,'b','2021-07-20',10);

 

查询数据:  select * from tb_rep_merge_tree 

 

 

对数据进行合并 select * from tb_rep_merge_tree

 

3、CollapsingMergeTree

CollapsingMergeTree消除ReplacingMergeTree的限制(只删除小版本字段,只保留最大版本数据)。该引擎要求在建表语句中指定一个标记列Sign,后台Compaction时会将主键相同、Sign相反的行进行折叠,也即删除。

缺点: 无法保证primary key相同的行落在同一个节点上,不在同一个节点上的数据无法折叠。因此在进行count(*),sum(col)等聚合计算时,可能存在数据冗余的情况。

 

标签:insert,数据,into,引擎,values,tb,id,ClickHouse
来源: https://www.cnblogs.com/linlf03/p/15054506.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有