该引擎属于日志引擎家族。有关日志引擎的通用属性及其差异,请参见 Log Engine Family。
该表引擎通常采用一次写入的方式:数据写入一次,然后根据需要多次读取。例如,可以将 TinyLog 类型的表用于按小批次处理的中间数据。请注意,将数据存储在大量小表中效率较低。
查询在单个 stream 中执行。换句话说,该引擎适用于相对较小的表 (最多约 1,000,000 行) 。如果你有许多小表,使用这种表引擎是合理的,因为它比 Log 引擎更简单 (需要打开的文件更少) 。
特性
- 结构更简单:与 Log 引擎不同,TinyLog 不使用标记文件。这降低了复杂性,但也限制了其针对大型数据集的性能优化能力。
- 单 stream 查询:对 TinyLog 表的查询会在单个 stream 中执行,因此它适用于相对较小的表,通常最多可达 1,000,000 行。
- 小表场景下效率更高:TinyLog 引擎结构简单,因此在管理大量小表时更具优势,因为与 Log 引擎相比,它需要更少的文件操作。
与 Log 引擎不同,TinyLog 不使用标记文件。这降低了复杂性,但也限制了其针对更大数据集的性能优化能力。
创建表
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = TinyLog请参阅 CREATE TABLE 查询的详细说明。
写入数据
TinyLog 引擎将所有列存储在一个文件中。对于每个 INSERT 查询,ClickHouse 都会将数据块追加到表文件末尾,并按列依次写入。
对于每个表,ClickHouse 会写入以下文件:
<column>.bin:每列对应一个数据文件,其中包含序列化并压缩后的数据。
TinyLog 引擎不支持 ALTER UPDATE 和 ALTER DELETE 操作。
使用示例
创建表:
CREATE TABLE tiny_log_table
(
timestamp DateTime,
message_type String,
message String
)
ENGINE = TinyLog插入数据:
INSERT INTO tiny_log_table VALUES (now(),'REGULAR','The first regular message')
INSERT INTO tiny_log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')我们使用了两个 INSERT 查询,在 <column>.bin 文件中创建了两个数据块。
ClickHouse 使用单个 stream 读取数据。因此,输出中各数据块的顺序与它们在输入中的顺序一致。例如:
SELECT * FROM tiny_log_table┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2024-12-10 13:11:58 │ REGULAR │ The first regular message │
│ 2024-12-10 13:12:12 │ REGULAR │ The second regular message │
│ 2024-12-10 13:12:12 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘