1 TinyLog引擎(数据不分块)
最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。
该引擎没有并发控制
- 只支持并发读
- 如果同时从表中读取和写入数据,则读取操作将抛出异常;
- 如果同时写入多个查询中的表,则数据将被破坏。
1.启动服务端
service clickhouse-server start
2.启动交互式客户端
clickhouse-client -m
3.建库
create database db_user;
4.建表
create table tb_TinyLog(
id UInt8,
name String,
score Float64
)
engine = TinyLog;
5.添加数据
insert into tb_TinyLog values(1,'zss','98.3'),(1,'lss','80.5');
- 再次添加数据
insert into tb_TinyLog values(3,'ww',70.6);
6.数据存储位置
data.bin — 数据文件。
index.mrk — 带标记的文件。标记包含了已插入的每个数据块中每列的偏移量。
2 StripeLog(数据分块列在一起)
在你需要写入许多小数据量(小于一百万行)的表的场景下使用这个引擎。
StripeLog 引擎将所有列存储在一个文件中。对每一次 Insert 请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。
StripeLog 引擎不支持 ALTER UPDATE 和 ALTER DELETE 操作。
1.建表
create table tb_StripeLog(
id UInt8,
name String,
score Float64
)
engine = StripeLog;
2.添加数据
insert into tb_StripeLog values(1,'zss','98.3'),(1,'lss','80.5');
- 再次添加数据
insert into tb_StripeLog values(3,'ww','50.6');
3 Log(数据分块记录偏移量)
日志与 TinyLog 的不同之处在于,«标记» 的小文件与列文件存在一起。这些标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。这使得可以在多个线程中读取表数据。对于并发数据访问,可以同时执行读取操作,而写入操作则阻塞读取和其它写入。Log 引擎不支持索引。同样,如果写入表失败,则该表将被破坏,并且从该表读取将返回错误。Log 引擎适用于临时数据,write-once 表以及测试或演示目的。
1.建表
create table tb_Log(
id UInt8,
name String,
score Float64
)
engine = Log;
2.添加数据
insert into tb_Log values(1,'zss','98.3'),(1,'lss','80.5');
- 再次添加数据
insert into tb_Log values(3,'ww','91.3');
总结
共同属性
- 数据存储在磁盘上。
- 写入时将数据追加在文件末尾。
- 不支持突变操作。
- 不支持索引。
- 这意味着 `SELECT` 在范围查询时效率不高。
- 非原子地写入数据。
- 如果某些事情破坏了写操作,例如服务器的异常关闭,你将会得到一张包含了损坏数据的表。
差异
- Log 和 StripeLog 引擎支持:
- 并发访问数据的锁。
- `INSERT` 请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除。如果没有写数据的请求,任意数量的读请求都可以并发执行。
- 并行读取数据。
- 在读取数据时,ClickHouse 使用多线程。 每个线程处理不同的数据块。
- Log 引擎为表中的每一列使用不同的文件。StripeLog 将所有的数据存储在一个文件中。因此 StripeLog 引擎在操作系统中使用更少的描述符,但是 Log 引擎提供更高的读性能。
- TinyLog 引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TingLog 引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中。它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和 Log 引擎同样多的描述符。你可以在简单的低负载的情景下使用它。