clickhouse表引擎-日志引擎系列

目录

 

1 简介:

1.1 这系列的引擎有:

1.2 共同点

1.3 差异 

1.4 总之:

2 TinyLog引擎

2.1 创建表

2.2 插入数据

3 StripLog引擎

3.1 创建表

3.2 插入数据

4 Log 引擎

4.1 建表

4.2 插入1调数据


1 简介:

这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。面对的数据查询场景也比较简单,并且往往是一次写入多次查询,则日志家族系列的表引擎将会是一种不错的选择。

1.1 这系列的引擎有:

1.2 共同点

  • 数据存储在磁盘上,如果是linux系统使用的是直接IO。

  • 写入时将数据追加在文件末尾。

  • 不支持突变操作也就是不支持update和delete操作。

  • 不支持索引。

    这意味着 `SELECT` 在范围查询时效率不高。

  • 非原子地写入数据。

    如果某些事情破坏了写操作,例如服务器的异常关闭,你将会得到一张包含了损坏数据的表。

1.3 差异 

Log 和 StripeLog 引擎支持:

  • 并发访问数据的锁。

    `INSERT` 请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除。如果没有写数据的请求,任意数量的读请求都可以并发执行。

  • 并行读取数据。

    在读取数据时,ClickHouse 使用多线程。 每个线程处理不同的数据块。

  • 性能由低到高:TinyLog-- >StripeLog --> Log

1.4 总之:

  • TinyLog:不支持并发读取数据文件,查询性能较差;格式简单,适合用来暂存中间数据。
  • StripLog:支持并发读取数据文件,查询性能比TinyLog好;将所有列存储在同一个大文件中,减少了文件个数。
  • Log:支持并发读取数据文件,查询性能比TinyLog好;每个列会单独存储在一个独立文件中。

2 TinyLog引擎

2.1 创建表

create table tb_test_TinyLog(`id` Int64,`vipId` Int64,`brandId` Int32,`shopId` Int32, `saleDate` Datetime64,saleMoney Float32) engine = TinyLog
b64d9704419c :) create table tb_test_TinyLog(`id` Int64,`vipId` Int64,`brandId` Int32,`shopId` Int32, `saleDate` Datetime64,saleMoney Float32) engine = TinyLog

CREATE TABLE tb_test_TinyLog
(
    `id` Int64, 
    `vipId` Int64, 
    `brandId` Int32, 
    `shopId` Int32, 
    `saleDate` Datetime64, 
    `saleMoney` Float32
)
ENGINE = TinyLog

Ok.

0 rows in set. Elapsed: 0.004 sec. 

b64d9704419c :)

刚创建就有表目录

但是表目录里是空的

2.2 插入数据

插入一条

insert into tb_test_TinyLog values (10001,8001,429,6001,'2020-10-01 14:15:23',200.50)

可见每个字段一个压缩的.bin文件,启动sizes.json是元文件,记录着每个字段对应的.bin文件的大小

再插入2条

insert into tb_test_TinyLog values (10002,8002,429,6001,'2020-10-02 14:15:23',300.50),(10003,8001,429,6001,'2020-10-02 14:15:23',100.50)

可见,后面插入的数据是在每个字段文件的后面追加。不会新增新的文件

TinyLog是日志家族系列中性能最低的表引擎,存储结构由数据文件和元数据两部分组成。其中数据文件按照列独立存储,即每个列字段都拥有一个与之对应的bin文件。TinyLog不支持分区,没有mrk文件,不支持bin文件的并行读取操作,只适合在非常简单的场景下使用。

3 StripLog引擎

3.1 创建表

create table tb_test_StripeLog(`id` Int64,`vipId` Int64,`brandId` Int32,`shopId` Int32, `saleDate` Datetime64,saleMoney Float32) engine = StripeLog

执行

b64d9704419c :) create table tb_test_StripeLog(`id` Int64,`vipId` Int64,`brandId` Int32,`shopId` Int32, `saleDate` Datetime64,saleMoney Float32) engine = StripeLog

CREATE TABLE tb_test_StripeLog
(
    `id` Int64, 
    `vipId` Int64, 
    `brandId` Int32, 
    `shopId` Int32, 
    `saleDate` Datetime64, 
    `saleMoney` Float32
)
ENGINE = StripeLog

Ok.

0 rows in set. Elapsed: 0.004 sec. 

b64d9704419c :)

刚创建生成目录

目录没数据的时候是空的

3.2 插入数据

插入1条数据

① data.bin 数据文件,所有的列字段使用一个文件保存,他们的数据都会被写入data.bin.

② index.mrk:数据标记文件,保存了数据在data.bin文件中的位置信息。利用数据标记能使用多线程,以并行的方式读取data.bin内的压缩数据块,从而提升数据查询的性能。

③ size.json:元数据文件,记录data.bin和index.mrk 大小的信息。

再插入2条

insert into tb_test_StripeLog values (10002,8002,429,6001,'2020-10-02 14:15:23',300.50),(10003,8001,429,6001,'2020-10-02 14:15:23',100.50)
b64d9704419c :) select * from tb_test_StripeLog;

SELECT *
FROM tb_test_StripeLog

┌────id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│ 10001 │  8001 │     429 │   6001 │ 2020-10-01 14:15:23.000 │     200.5 │
└───────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘
┌────id─┬─vipId─┬─brandId─┬─shopId─┬────────────────saleDate─┬─saleMoney─┐
│ 10002 │  8002 │     429 │   6001 │ 2020-10-02 14:15:23.000 │     300.5 │
│ 10003 │  8001 │     429 │   6001 │ 2020-10-02 14:15:23.000 │     100.5 │
└───────┴───────┴─────────┴────────┴─────────────────────────┴───────────┘

3 rows in set. Elapsed: 0.003 sec. 

b64d9704419c :) 

可见再插入数据就会在数据文件data.bin 后面追加上去

4 Log 引擎

4.1 建表

create table tb_test_Log(`id` Int64,`vipId` Int64,`brandId` Int32,`shopId` Int32, `saleDate` Datetime64,saleMoney Float32) engine = Log
b64d9704419c :) create table tb_test_Log(`id` Int64,`vipId` Int64,`brandId` Int32,`shopId` Int32, `saleDate` Datetime64,saleMoney Float32) engine = Log

CREATE TABLE tb_test_Log
(
    `id` Int64, 
    `vipId` Int64, 
    `brandId` Int32, 
    `shopId` Int32, 
    `saleDate` Datetime64, 
    `saleMoney` Float32
)
ENGINE = Log

Ok.

0 rows in set. Elapsed: 0.007 sec. 

b64d9704419c :) 

刚创建生成目录

目录没数据的时候是空的

4.2 插入1调数据

insert into tb_test_Log values (10001,8001,429,6001,'2020-10-01 14:15:23',200.50)

Log表引擎是日志家族系列中性能最高的表引擎。Log表引擎的存储结构由三部分组成:

[Columns].bin数据文件,数据文件按照列独立存储,每个列字段都拥有一个与之对应的bin文件。

_marks.mrk :数据标记文件,统一保存了数据在各个[column].bin文件中的位置信息,利用数据标记能使用多个线程,以并行的方式读取bin文件内的压缩数据块,从而提高数据查询的性能。

size.json:元数据文件,记录了[column].bin和_marks.mrk大小的信息。

Log拥有了数据标记和各个列数据独立存储的功能,则可以支持并行查询和按照列读取数据,但是也需要更多的文件描述符,相对于StripeLog.

 插入2条

insert into tb_test_Log values (10002,8002,429,6001,'2020-10-02 14:15:23',300.50),(10003,8001,429,6001,'2020-10-02 14:15:23',100.50)

可见,后面插入的数据是在每个字段文件的后面追加。不会新增新的文件

 

参考:https://clickhouse.tech/docs/en/engines/table-engines/log-family/

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值