表引擎:
一、日志引擎
创建表 引擎使用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)等聚合计算时,可能存在数据冗余的情况。