跳到主要内容
跳到主要内容

Log

该引擎属于 Log 引擎家族。请参阅 Log 引擎家族 文章中 Log 引擎的通用属性及其差异。

LogTinyLog 的区别在于,一个小的“标记”文件与列文件一起驻留。这些标记在每个数据块上写入,并包含偏移量,指示从哪里开始读取文件,以便跳过指定数量的行。这使得在多线程中读取表数据成为可能。对于并发数据访问,读取操作可以同时执行,而写入操作会阻止读取操作以及彼此之间的写入操作。Log 引擎不支持索引。同样,如果写入表失败,则表会损坏,并且从中读取会返回错误。Log 引擎适用于临时数据、一次写入表以及用于测试或演示目的。

创建表

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 = Log

请参阅 CREATE TABLE 查询的详细描述。

写入数据

Log 引擎通过将每列写入其自己的文件来高效地存储数据。对于每个表,Log 引擎将以下文件写入指定的存储路径

  • <column>.bin:每个列的数据文件,包含序列化和压缩的数据。 __marks.mrk:标记文件,存储每个插入数据块的偏移量和行数。标记用于通过允许引擎在读取期间跳过不相关的数据块来促进高效的查询执行。

写入过程

当数据写入 Log 表时

  1. 数据被序列化并压缩成块。
  2. 对于每一列,压缩后的数据都会附加到其各自的 <column>.bin 文件中。
  3. 相应的条目被添加到 __marks.mrk 文件中,以记录新插入数据的偏移量和行数。

读取数据

带有标记的文件允许 ClickHouse 并行读取数据。这意味着 SELECT 查询以不可预测的顺序返回行。使用 ORDER BY 子句对行进行排序。

使用示例

创建表

CREATE TABLE log_table
(
timestamp DateTime,
message_type String,
message String
)
ENGINE = Log

插入数据

INSERT INTO log_table VALUES (now(),'REGULAR','The first regular message')
INSERT INTO log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')

我们使用两个 INSERT 查询在 <column>.bin 文件中创建了两个数据块。

ClickHouse 在选择数据时使用多个线程。每个线程读取一个单独的数据块,并在完成后独立返回结果行。因此,输出中行块的顺序可能与输入中相同块的顺序不匹配。例如

SELECT * FROM log_table
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘
┌───────────timestamp─┬─message_type─┬─message───────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
└─────────────────────┴──────────────┴───────────────────────────┘

对结果进行排序(默认升序)

SELECT * FROM log_table ORDER BY timestamp
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘