日志
该引擎属于 Log
引擎系列。请参阅 日志引擎系列 文章中的 Log
引擎的常见属性及其差异。
Log
与 TinyLog 的不同之处在于,与列文件一起存在一个小文件 "marks"。这些标记在每个数据块上写入,包含指示在文件中开始读取的位置的偏移量,以跳过指定的行数。这使得可以在多个线程中读取表数据。
对于并发数据访问,读取操作可以同时进行,而写入操作会阻塞读取和彼此。
Log
引擎不支持索引。同样,如果写入表失败,则表会损坏,读取时将返回错误。Log
引擎适用于临时数据、单次写入表以及测试或演示目的。
创建表
请参阅 CREATE TABLE 查询的详细描述。
写入数据
Log
引擎通过将每列写入自己的文件来有效存储数据。对于每个表,Log 引擎会在指定的存储路径写入以下文件:
<column>.bin
:每个列的数据文件,包含序列化和压缩的数据。__marks.mrk
:标记文件,存储每个插入的数据块的偏移量和行计数。标记用于通过允许引擎在读取时跳过无关的数据块,从而促进高效的查询执行。
写入过程
当数据写入 Log
表时:
- 数据被序列化并压缩成块。
- 对于每列,压缩的数据被附加到其各自的
<column>.bin
文件中。 - 在
__marks.mrk
文件中添加相应条目,以记录新插入数据的偏移量和行计数。
读取数据
带有标记的文件允许 ClickHouse 并行读取数据。这意味着 SELECT
查询以不可预测的顺序返回行。使用 ORDER BY
子句对行进行排序。
用法示例
创建一个表:
插入数据:
我们使用两个 INSERT
查询在 <column>.bin
文件中创建两个数据块。
ClickHouse 在选择数据时使用多个线程。每个线程读取一个单独的数据块,并在完成时独立返回结果行。因此,输出中行块的顺序可能与输入中的相同块的顺序不匹配。例如:
对结果进行排序(默认按升序排列):