目录
系列表引擎的特点
共性特点
-
数据存储在磁盘上
-
当写数据时,将数据追加到⽂件的末尾
-
不⽀持 并发读写 ,当向表中写⼊数据时,针对这张表的查询会被阻塞,直⾄写⼊动作结束
-
不⽀持索引
-
不⽀持原⼦写:如果某些操作 ( 异常的服务器关闭 ) 中断了写操作,则可能会获得带有损坏数据的表
-
不⽀持 ALTER 操作 ( 这些操作会修改表设置或数据,⽐如 delete 、 update 等等 )
区别
-
TinyLogTinyLog 是 Log 系列引擎中功能简单、性能较低的引擎。它的存储结构由数据⽂件和元数据两部分组成。其 中, 数据⽂件是按列独⽴存储的,也就是说每⼀个列字段都对应⼀个⽂件 。除此之外, TinyLog 不⽀持并发数
-
据读取。
-
StripLog ⽀持并发读取数据⽂件,当读取数据时, ClickHouse 会使⽤多线程进⾏读取,每个线程处理⼀个单 独的数据块。另外, StripLog 将所有列数据存储在同⼀个⽂件中 ,减少了⽂件的使⽤数量。
-
Log ⽀持并发读取数据⽂件,当读取数据时, ClickHouse 会使⽤多线程进⾏读取,每个线程处理⼀个单独的数 据块。 Log 引擎会将每个列数据单独存储在⼀个独⽴⽂件中
TinyLog表引擎使⽤
该引擎适⽤于
⼀次写⼊,多次读取的场景
。对于处理⼩批数据的中间表可以使⽤该引擎。值得注意的是,使⽤⼤量
的⼩表存储数据,性能会很低。
CREATE TABLE emp_tinylog4 (
emp_id UInt16 COMMENT '员工id',
name String COMMENT '员工姓名',
work_place String COMMENT '工作地点',
age UInt8 COMMENT '员工年龄',
depart String COMMENT '部门',
salary Decimal32(2) COMMENT '工资')
ENGINE=TinyLog();
INSERT INTO emp_tinylog4 VALUES (1,'tom','上海',25,'技术部',20000),(2,'jack','上海',26,'人事部',10000);
INSERT INTO emp_tinylog4 VALUES (3,'bob','北京',33,'财务部',50000),(4,'tony','杭州',28,'销售事部',50000);

进⼊默认数据存储⽬录,查看底层数据存储形式
,
可以看出:
TinyLog
引擎表每⼀列都对应的⽂件:

当我们执⾏
ALTER
操作
时会报错,说明该表引擎不⽀持
ALTER
操作
node1 :) ALTER TABLE emp_tinylog4 DELETE WHERE emp_id = 5;
ALTER TABLE emp_tinylog
DELETE WHERE emp_id = 5
Received exception from server (version 20.5.2):
Code: 48. DB::Exception: Received from localhost:9009. DB::Exception: Mutations are not
supported by storage TinyLog.
StripLog表引擎
相⽐
TinyLog
⽽⾔,
StripeLog
拥有更⾼的查询性能(拥有
.mrk
标记⽂件,⽀持并⾏查询),同时其使⽤了更少的
⽂件描述符(所有数据使⽤同⼀个⽂件保存)。
创建
StripeLog
表
CREATE TABLE emp_stripelog4 (
emp_id UInt16 COMMENT '员工id',
name String COMMENT '员工姓名',
work_place String COMMENT '工作地点',
age UInt8 COMMENT '员工年龄',
depart String COMMENT '部门',
salary Decimal32(2) COMMENT '工资')
ENGINE=StripeLog;
--
插⼊数据
INSERT INTO emp_stripelog4 VALUES (1,'tom','上海',25,'技术部',20000),(2,'jack','上海',26,'人事部',10000);
INSERT INTO emp_stripelog4 VALUES (3,'bob','北京',33,'财务部',50000),(4,'tony','杭州',28,'销售事部',50000);
--
查询数据
--
由于是分两次插⼊数据,所以查询时会有两个数据块

进⼊默认数据存储⽬录,查看底层数据存储形式

可以看出
StripeLog
表引擎对应的存储结构包括三个⽂件:
-
data.bin :数据⽂件,所有的列字段使⽤同⼀个⽂件保存,它们的数据都会被写⼊ data.bin 。
-
index.mrk :数据标记,保存了数据在 data.bin ⽂件中的位置信息 ( 每个插⼊数据块对应列的 offset) ,利⽤数据 标记能够使⽤多个线程,以并⾏的⽅式读取 data.bin 内的压缩数据块,从⽽提升数据查询的性能。
-
sizes.json :元数据⽂件,记录了 data.bin 和 index.mrk ⼤⼩的信息
注:
1
、
StripeLog
引擎将所有数据都存储在了⼀个⽂件中,对于每次的
INSERT
操作,
ClickHouse
会将
数据块
追
加到表⽂件的末尾
2
、
StripeLog
引擎同样不⽀持
ALTER UPDATE
和
ALTER DELETE
操作
Log表引擎
Log
引擎表适⽤于临时数据
,⼀次性写⼊、测试场景。
Log
引擎结合了
TinyLog
表引擎和
StripeLog
表引擎的⻓处,
是
Log
系列引擎中性能最⾼的表引擎。
CREATE TABLE emp_log4 (
emp_id UInt16 COMMENT '员工id',
name String COMMENT '员工姓名',
work_place String COMMENT '工作地点',
age UInt8 COMMENT '员⼯年龄',
depart String COMMENT '部门',
salary Decimal32(2) COMMENT '工资')
ENGINE=Log;
--
查询数据,
--
由于是分两次插⼊数据,所以查询时会有两个数据块
INSERT INTO emp_log4 VALUES (1,'tom','上海',25,'技术部',20000),(2,'jack','上海',26,'人事部',10000);
INSERT INTO emp_log4 VALUES (3,'bob','北京',33,'财务部',50000),(4,'tony','杭州',28,'销售事部',50000);

进⼊默认数据存储⽬录,查看底层数据存储形式

Log
引擎的存储结构包含三部分:
-
列 .bin :数据⽂件,数据⽂件按列单独存储
-
__marks.mrk :数据标记,统⼀保存了数据在各个 .bin ⽂件中的位置信息。利⽤数据标记能够使⽤多个线程, 以并⾏的⽅式读取。 .bin 内的压缩数据块,从⽽提升数据查询的性能。
-
sizes.json :记录了 .bin 和 __marks.mrk ⼤⼩的信息