clickhouse(四)-表引擎

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

  1. 数据的存储方式和位置,写到哪里以及从哪里读取数据
  2. 支持哪些查询以及如何支持。
  3. 并发数据访问。
  4. 索引的使用(如果存在)。
  5. 是否可以执行多线程请求。
  6. 数据复制参数。

在读取时,引擎只需要输出所请求的列,但在某些情况下,引擎可以在响应请求时部分处理数据。对于大多数正式的任务,应该使用MergeTree族中的引擎。

1 日志引擎

具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。

1.1TinyLog引擎(数据不分快)

 

1.2 StripeLog

1.3Log

2 MergeTree引擎

2.1 MergeTree()

2.2 ReplacingMergeTree

2.3 SummingMergeTree引擎

将相同主键的数据分区内合并指定字段进行累加

  • 建表
create table tb_summ_merge_tree(
id Int8 ,
name String ,
ctime Date ,
cost UInt8 
)
engine=SummingMergeTree(cost)
order by id 
partition by name 
primary key id;
  • 插入数据
insert into tb_summ_merge_tree values (1, 'a','2020-08-05', 20);
insert into tb_summ_merge_tree values (1, 'b','2020-08-05', 30);
insert into tb_summ_merge_tree values (1, 'a','2020-08-05', 20);
insert into tb_summ_merge_tree values (1, 'a','2020-08-05', 30);
insert into tb_summ_merge_tree values (1, 'b','2020-08-05', 10);
  • 查询数据
SELECT *
FROM tb_summ_merge_tree

┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ a    │ 2020-08-05 │   20 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ b    │ 2020-08-05 │   30 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ a    │ 2020-08-05 │   20 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ b    │ 2020-08-05 │   10 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ a    │ 2020-08-05 │   30 │
└────┴──────┴────────────┴──────┘
  • 合并表 ; 分区合并 --> 区内去除重复的主键 , 指定字段进行累加

doit01 :) optimize  table tb_summ_merge_tree ;  -- 合并数据


┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ b    │ 2020-08-05 │   30 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ b    │ 2020-08-05 │   10 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ a    │ 2020-08-05 │   70 │----****
└────┴──────┴────────────┴──────┘
doit01 :) optimize  table tb_summ_merge_tree ;


┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ a    │ 2020-08-05 │   70 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│  1 │ b    │ 2020-08-05 │   40 │
└────┴──────┴────────────┴──────┘

2.4 CollapsingMergeTree

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

CollapsingMergeTree虽然解决了主键相同的数据即时删除的问题,但是状态持续变化且多线程并行写入情况下,状态行与取消行位置可能乱序,导致无法正常折叠。只有保证老的状态行在在取消行的上面, 新的状态行在取消行的下面! 但是多线程无法保证写的顺序!

  • 建表
CREATE TABLE tb_cps_merge_tree
(
    uid UInt64,
    name String,
    age UInt8,
    sign Int8
)
ENGINE = CollapsingMergeTree(sign)
ORDER BY user_id;

插入数据

INSERT INTO tb_cps_merge_tree VALUES (1001,'ADA', 18, 1);
INSERT INTO tb_cps_merge_tree VALUES (1001,'ADA', 19, -1);
INSERT INTO tb_cps_merge_tree VALUES (1001,'ADA', 20, 1);

INSERT INTO tb_cps_merge_tree VALUES (1002,'zss', 21, -1);
INSERT INTO tb_cps_merge_tree VALUES (1002,'zss', 19, 1);

INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 19, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 29, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 39, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 49, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 21, -1);

INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 19, 1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 59, 1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 21, -1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 39, 1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 49, 1);

INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 59, 1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 29, 1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 21, -1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 39, 1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 49, 1);

2.5VersionedCollapsingMergeTree

取消字段和数据版本同事使用,避免取消行数据无法删除的问题

为了解决CollapsingMergeTree乱序写入情况下无法正常折叠问题VersionedCollapsingMergeTree表引擎在建表语句中新增了一列Version,用于在乱序情况下记录状态行与取消行的对应关系。主键相同,且Version相同、Sign相反的行,在Compaction时会被删除。

与CollapsingMergeTree类似, 为了获得正确结果,业务层需要改写SQL,将count()、sum(col)分别改写为sum(Sign)、sum(col * Sign)。

CREATE TABLE tb_vscmt
(
    uid UInt64,
    name String,
    age UInt8,
    sign Int8,
    version UInt8
)
ENGINE = VersionedCollapsingMergeTree(sign, version)
ORDER BY uid;
INSERT INTO tb_vscmt VALUES (1001, 'ADA', 18, -1, 1);
INSERT INTO tb_vscmt VALUES (1001, 'ADA', 18, 1, 1),(101, 'DAD', 19, 1, 2);(101, 'DAD', 11, 1, 3); 
INSERT INTO tb_vscmt VALUES(101, 'DAD', 11, 1, 3) ;

猜你喜欢

转载自blog.csdn.net/qq_37933018/article/details/108213027