目录
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/