Log系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景,即一次写入,多次查询。Log系列表引擎包含:TinyLog、StripeLog、Log三种引擎。
几种Log表引擎的共性是:
它们彼此之间的区别是:
TinyLog是Log系列引擎中功能简单、性能较低的引擎。
它的存储结构由数据文件和元数据两部分组成。其中,数据文件是按列独立存储的,也就是说每一个列字段都对应一个文件。
由于TinyLog数据存储不分块,所以不支持并发数据读取,该引擎适合一次写入,多次读取的场景,对于处理小批量中间表的数据可以使用该引擎,这种引擎会有大量小文件,性能会低。
#在ch中创建库 newdb,并使用
node1 :) create database newdb;
node1 :) use newdb;
#创建表t_tinylog 表,使用TinyLog引擎
node1 :) create table t_tinylog(id UInt8,name String,age UInt8) engine=TinyLog;
#向表中插入数据
node1 :) insert into t_tinylog values (1,'张三',18),(2,'李四',19),(3,'王五',20);
#查询表中的数据
node1 :) select * from t_tinylog;
SELECT *
FROM t_tinylog
┌─id─┬─name─┬─age─┐
│ 1 │ 张三 │ 18 │
│ 2 │ 李四 │ 19 │
│ 3 │ 王五 │ 20 │
└────┴──────┴─────┘
3 rows in set. Elapsed: 0.003 sec.
#在表中删除一条数据,这里是不支持delete。
node1 :) delete from t_tinylog where id = 1;//语句不适合CH
node1 :) alter table t_tinylog delete where id = 1;
:Exception: Mutations are not supported by storage TinyLog.
当在newdb库中创建表t_tinylog后,在ClickHouse保存数据的目录/var/lib/clickhouse/data/newdb/下会多一个t_tinylog目录,如图所示:
在向表t_tinylog中插入数据后,进入“t_tinylog”目录,查看目录下的文件,如下图所示:
我们可以发现,表t_tinylog中的每个列都单独对应一个*.bin文件,同时还有一个sizes.json文件存储元数据,记录了每个bin文件中数据大小。
相比TinyLog而言,StripeLog数据存储会划分块,每次插入对应一个数据块,拥有更高的查询性能(拥有.mrk标记文件,支持并行查询)。StripeLog 引擎将所有列存储在一个文件中,使用了更少的文件描述符。对每一次 Insert 请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。StripeLog 引擎不支持 ALTER UPDATE 和 ALTER DELETE 操作。
#在库 newdb中创建表 t_stripelog,使用StripeLog引擎
node1 :) create table t_stripelog(id UInt8,name String,age UInt8) engine = StripeLog;
#向表t_stripelog中插入数据,这里插入分多次插入,会将数据插入不同的数据块中
node1 :) insert into t_stripelog values (1,'张三',18);
node1 :) insert into t_stripelog values (2,'李四',19);
#查询表 t_stripelog数据
node1 :) select * from t_stripelog;
SELECT *
FROM t_stripelog
┌─id─┬─name─┬─age─┐
│ 1 │ 张三 │ 18 │
└────┴──────┴─────┘
┌─id─┬─name─┬─age─┐
│ 2 │ 李四 │ 19 │
└────┴──────┴─────┘
2 rows in set. Elapsed: 0.003 sec.
当在newdb库中创建表 t_stripelog后,在ClickHouse保存数据的目录/var/lib/clickhouse/data/newdb/下会多一个t_stripelog目录,如图所示:
在向表t_stripelog中插入数据后,进入“t_stripelog”目录,查看目录下的文件,如下图所示:
我们可以发现只有三个文件:
Log引擎表适用于临时数据,一次性写入、测试场景。Log引擎结合了TinyLog表引擎和StripeLog表引擎的长处,是Log系列引擎中性能最高的表引擎。
Log表引擎会将每一列都存在一个文件中,对于每一次的INSERT操作,会生成数据块,经测试,数据块个数与当前节点的core数一致。
#在newdb中创建表t_log 使用Log表引擎
node1 :) create table t_log(id UInt8 ,name String ,age UInt8 ) engine = Log;
#向表 t_log中插入数据,分多次插入,插入后数据存入数据块
node1 :) insert into t_log values (1,'张三',18);
node1 :) insert into t_log values (2,'李四',19);
node1 :) insert into t_log values (3,'王五',20);
node1 :) insert into t_log values (4,'马六',21);
node1 :) insert into t_log values (5,'田七',22);
#查询表t_log中的数据
node1 :) select * from t_log;
SELECT *
FROM t_log
┌─id─┬─name─┬─age─┐
│ 1 │ 张三 │ 18 │
│ 2 │ 李四 │ 19 │
└────┴─────┴─────┘
┌─id─┬─name─┬─age─┐
│ 3 │ 王五 │ 20 │
│ 4 │ 马六 │ 21 │
│ 5 │ 田七 │ 22 │
└────┴─────┴─────┘
5 rows in set. Elapsed: 0.004 sec.
当在newdb库中创建表 t_log后,在ClickHouse保存数据的目录/var/lib/clickhouse/data/newdb/下会多一个t_log目录,如图所示:
在向表t_log中插入数据后,进入“t_log”目录,查看目录下的文件,如下图所示:
我们发现表t_log中的每个列都对应一个*.bin文件。其他两个文件的解释如下:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。