持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
前言
1、日志家族表引擎:这些引擎是为需要快速编写许多小表(最多约100万行)并在以后整体读取它们的场景而开发的。日志家族引擎包括:StripeLog、Log、TinyLog,日志族表引擎可以将数据存储到HDFS或S3分布式文件系统。
2、这种表引擎具有一下的属性或者说是特性:
- 将数据存储在磁盘上。
- 写入时将数据附加到文件末尾。
- 支持并发数据访问的锁。 在INSERT查询期间,表被锁定,其他用于读取和写入数据的查询都会等待表解锁。如果没有数据写入查询,则可以同时执行任意数量的数据读取查询。
- 不支持突变。
- 不支持索引。 这意味着对数据范围的SELECT查询是无效的。
- 不要以原子方式写入数据。
正文
分别讲解日志引擎中的三种引擎。
Log引擎讲解
该引擎属于日志引擎家族。 Log与TinyLog的不同之处在于,列文件中有一个小的“标记”文件。这些标记写在每个数据块上,并包含偏移量,指示从何处开始读取文件,以便跳过指定的行数。这使得可以在多个线程中读取表数据。对于并发数据访问,读取操作可以同时执行,而写入操作可以相互阻塞读取。日志引擎不支持索引。类似地,如果写入表失败,则表将被破坏,从中读取将返回错误。日志引擎适用于临时数据、只写一次表以及用于测试或演示目的。
TinyLog引擎讲解
此表引擎通常与一次写入方法一起使用:写入数据一次,然后根据需要多次读取数据。例如,可以对小批量处理的中间数据使用TinyLog类型表。请注意,在大量小表中存储数据效率低下。
查询在单个流中执行。换句话说,该引擎适用于相对较小的表(最多约1000000行)。如果您有许多小表,那么使用这个表引擎是有意义的,因为它比日志引擎简单(需要打开的文件更少)。
Stripelog引擎讲解
在需要编写包含少量数据(少于100万行)的多个表的场景中使用此引擎。StripeLog引擎将所有列存储在一个文件中。对于每个INSERT查询,ClickHouse将数据块附加到表文件的末尾,逐个写入列。 对于每个表,ClickHouse都会写入以下文件:
- data.bin—数据文件。
- index.mrk—带标记的文件。标记包含插入的每个数据块的每列的偏移量。
注意:StripeLog引擎不支持ALTER UPDATE和ALTER DELETE操作。
三个引擎之间的差异性
a) 如果写操作发生中断,例如服务器异常关闭,您可能会得到一个包含损坏数据的表。 TinyLog引擎是该系列中最简单的引擎,功能最差,效率最低。TinyLog引擎不支持在单个查询中由多个线程并行读取数据。它读取数据的速度比家族中支持从单个查询并行读取的其他引擎慢,它使用的文件描述符几乎与日志引擎一样多,因为它将每个列存储在单独的文件中。仅在简单场景中使用。
b) Log和StripeLog引擎支持并行数据读取。在读取数据时,ClickHouse使用多个线程。每个线程处理一个单独的数据块。日志引擎对表的每一列使用单独的文件。StripeLog将所有数据存储在一个文件中。因此,StripeLog引擎使用更少的文件描述符,但Log引擎在读取数据时提供了更高的效率。
Stripelog引擎案例实操
a) 创建一个StripeLog引擎表
CREATE TABLE stripe_log_table
(
timestamp DateTime,
message_type String,
message String
)
ENGINE = StripeLog
b) 插入三条测试数据
INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The first regular message')
INSERT INTO stripe_log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')
c) 查询数据,每次返回结果顺序不一致。
SELECT * FROM stripe_log_table
带有标记的文件允许ClickHouse并行读取数据。这意味着SELECT查询以不可预知的顺序返回行。使用ORDER BY子句对行进行排序。
SELECT * FROM stripe_log_table ORDER BY timestamp
总结
这节我们主要讲解了表引擎家族中的日志引擎。该引擎主要包含三个StripeLog、Log、TinyLog,并对这三个引擎的一个属性、特点做了一个阐述,并进行了一次实操。欢迎大家讨论并关注!!!你们的支持是我创作前进的动力。