ClickHouse 表引擎

本文详细介绍了ClickHouse的几种表引擎,包括日志引擎(TinyLog、StripeLog、Log)的特点和使用场景,强调它们在并发访问和数据读取上的差异。同时,重点讨论了MergeTree家族引擎,如MergeTree、ReplacingMergeTree、CollapsingMergeTree和VersionedCollapsingMergeTree,解释了它们如何处理数据存储、排序、去重和聚合,以及在处理实时数据变更时的优势和限制。文章还提及了其他如AggregatingMergeTree和GraphiteMergeTree等特殊用途的引擎。
摘要由CSDN通过智能技术生成

表引擎(即表的类型)决定了:

  1. 数据的存储方式和位置,写到哪里以及从哪里读取数据
  2. 支持哪些查询以及如何支持。
  3. 并发数据访问。
  4. 索引的使用(如果存在)。
  5. 是否可以执行多线程请求。
  6. 数据复制参数。
  7. 在读取时,引擎只需要输出所请求的列,但在某些情况下,引擎可以在响应请求时部分处理数据。对于大多数正式的任务,应该使用MergeTree族中的引擎。

1 日志引擎

  具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。

1 TinyLog引擎(数据不分块)

最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。

该引擎没有并发控制
只支持并发读

如果同时从表中读取和写入数据,则读取操作将抛出异常;
如果同时写入多个查询中的表,则数据将被破坏。

– 建表

create table tb_tinylog(id Int8 , name String , age Int8) engine=TinyLog ;

– 插入数据

insert into tb_tinylog values(1,'马云',56),(2,'马化腾',55),(3,'马克思',123) ;

– 查询数据

:) SELECT * FROM tb_tinylog

结果 :

SELECT *
FROM tb_tinylog
┌─id─┬─name───┬─age─┐
│ 1 │ 马云 │ 56 │
│ 2 │ 马化腾 │ 55 │
│ 3 │ 马克思 │ 123 │
└────┴────────┴─────┘
3 rows in set. Elapsed: 0.015 sec.
在这里插入图片描述

数据存储在机器的磁盘上,每列一个文件,插入数据向列文件的后面追加
在这里插入图片描述

*age.bin 和 id.bin,name.bin 是压缩过的对应的列的数据,sizes.json 中记录了每个 .bin 文件的大小:

# cat sizes.json 
{
   "yandex":{
   "age%2Ebin":{
   "size":"29"},"id%2Ebin":{
   "size":"29"},"name%2Ebin":{
   "size":"54"}}}

这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它比需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。不支持索引。

2 StripeLog(数据分块列在一起)

在你需要写入许多小数据量(小于一百万行)的表的场景下使用这个引擎。

– 建表

CREATE TABLE stripe_log_table( \
    timestamp DateTime,     \
    message_type String,    \
message String)ENGINE = StripeLog ;

– 插入数据

INSERT INTO stripe_log_table VALUES (now(),'Title','wedoctor') ;
INSERT INTO stripe_log_table VALUES (now(),'project','spark'),(now(),'WARNING','gogogo') ;

–写数据
在这里插入图片描述

StripeLog 引擎将所有列存储在一个文件中。对每一次 Insert 请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。
ClickHouse 为每张表写入以下文件:
data.bin — 数据文件。
index.mrk — 带标记的文件。标记包含了已插入的每个数据块中每列的偏移量。
StripeLog 引擎不支持 ALTER UPDATE 和 ALTER DELETE 操作。

–读数据
带标记的文件使得 ClickHouse 可以并行的读取数据。这意味着 SELECT 请求返回行的顺序是不可预测的。使用 ORDER BY 子句对行进行排序。
我们使用两次 INSERT 请求从而在 data.bin 文件中创建两个数据块。
ClickHouse 在查询数据时使用多线程。每个线程读取单独的数据块并在完成后独立的返回结果行。这样的结果是,大多数情况下,输出中块的顺序和输入时相应块的顺序是不同的。例如:

:) select * from  stripe_log_table ;
SELECT *
FROM stripe_log_table

┌───────────timestamp─┬─message_type─┬─message─┐
│ 2020-08-25 23:15:42 │ project │ spark │
│ 2020-08-25 23:15:42 │ WARNING │ gogogo │
└─────────────────────┴──────────────┴─────────┘
┌───────────timestamp─┬─message_type─┬─message──┐
│ 2020-08-25 23:15:41 │ Title │ wedoctor │
└─────────────────────┴──────────────┴──────────┘
3

 rows in set. Elapsed: 0.003 sec.
:) select * from  stripe_log_table ;
SELECT *
FROM stripe_log_table

┌───────────timestamp─┬─message_type─┬─message──┐
│ 2020-08-25 23:15:41 │ Title │ wedoctor │
└─────────────────────┴──────────────┴──────────┘
┌───────────timestamp─┬─message_type─┬─message─┐
│ 2020-08-25 23:15:42 │ project │ spark │
│ 2020-08-25 23:15:42 │ WARNING │ gogogo │
└─────────────────────┴──────────────┴─────────┘

3 rows in set. Elapsed: 0.003 sec.

3 Log(数据分块记录偏移量)

日志与 TinyLog 的不同之处在于,«标记» 的小文件与列文件存在一起。这些标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。这使得可以在多个线程中读取表数据。对于并发数据访问,可以同时执行读取操作,而写入操作则阻塞读取和其它写入。Log 引擎不支持索引。同样,如果写入表失败,则该表将被破坏,并且从该表读取将返回错误。Log 引擎适用于临时数据,write-once 表以及测试或演示目的。

– 建表

create table tb_log(id Int8 , name String , age Int8) engine=Log ;

–插入数据

insert into tb_log values(1,'马云',56),(2,'马化腾',55),(3,'马克思',123) ;
insert into tb_log values(4,'xiaohong',26),(5,'xiaofang',35),(6,'xiaohua',45) ;

在这里插入图片描述

4 总结

共同属性
数据存储在磁盘上。
写入时将数据追加在文件末尾。
不支持突变操作。
不支持索引。这意味着 SELECT 在范围查询时效率不高。
非原子地写入数据。
如果某些事情破坏了写操作,例如服务器的异常关闭,你将会得到一张包含了损坏数据的表。

差异

Log 和 StripeLog 引擎支持
并发访问数据的锁。
INSERT 请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除。如果没有写数据的请求,任意数量的读请求都可以并发执行。
并行读取数据。
在读取数据时,ClickHouse 使用多线程。每个线程处理不同的数据块。

Log 引擎为表中的每一列使用不同的文件。StripeLog 将所有的数据存储在一个文件中。因此 StripeLog 引擎在操作系统中使用更少的描述符,但是 Log 引擎提供更高的读性能。

TinyLog 引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TingLog 引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中。它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和 Log 引擎同样多的描述符。你可以在简单的低负载的情景下使用它

2 MergeTree家族引擎

  MergeTree系列的表引擎是ClickHouse数据存储功能的核心。它们提供了用于弹性和高性能数据检索的大多数功能:列存储,自定义分区,稀疏的主索引,辅助数据跳过索引等。
  基本MergeTree表引擎可以被认为是单节点ClickHouse实例的默认表引擎,因为它在各种用例中通用且实用。

对于生产用途,ReplicatedMergeTree是必经之路,因为它为常规MergeTree引擎的所有功能增加了高可用性。一个额外的好处是在数据提取时自动进行重复数据删除,因此如果插入过程中出现网络问题,该软件可以安全地重试。
MergeTree系列的所有其他引擎为某些特定用例添加了额外的功能。通常,它是作为后台的其他数据操作实现的。
MergeTree引擎的主要缺点是它们很重。因此,典型的模式是没有太多。如果您需要许多小表(例如用于临时数据),请考虑使用Log engine family。
允许快速写入不断变化的对象状态。
删除后台中的旧对象状态。这显着降低了存储体积。

该MergeTree系列(*MergeTree)的引擎和其他引擎是最强大的ClickHouse表引擎。
该MergeTree系列中的引擎旨在将大量数据插入表中。数据快速地逐个部分地写入表中,然后应用规则在后台合并这些部分。这种方法比插入期间连续重写存储中的数据效率更高。

主要特点:

存储按主键排序的数据。
这使您可以创建一个小的稀疏索引,以帮助更快地查找数据。
如果指定了分区键,则可以使用分区。
ClickHouse支持的某些分区操作比对相同数据,相同结果的常规操作更有效。ClickHouse会自动切断在查询中指定了分区键的分区数据。提高了查询性能。
数据复制支持。
ReplicatedMergeTree表族提供数据复制。有关更多信息.
数据采样支持。
如有必要,可以在表中设置数据采样方法。

1
MergeTree

基本格式

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
    name2 [type2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值