clickhouse引擎–Log引擎

  • Post author:
  • Post category:其他



表引擎是clickhouse设计实现中的一大特色表引擎(即表的类型)决定了

  1. 数据的存储方式和位置,写到哪里以及从哪里读取数据
  2. 支持哪些查询以及如何支持
  3. 并发数据访问
  4. 索引的使用(如果存在)
  5. 是否可以执行多线程请求
  6. 数据复制参数,是否可以存储数据副本
  7. 分布式引擎实现分布式



Log系列引擎

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



一.TinyLog引擎

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

没有并发控制


1.最简单的引擎

2.没有索引,没有标记块、

3.写是追加写

4.数据以列字段文件存储

5.不允许同时读写(

insert into a select * from b

会将表存储结构损坏,如果误操作需要删除表目录,删除元数据)

create table tb_tinyLog(
id UInt8,
name String
)engine=TinyLog;

insert into tb_tinyLog values(1,'zs'),(2,'ls'),(3,'ww');
select * from tb_tinyLog;
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘
insert into tb_tinyLog values(4,'zl');   //追加写入select * from tb_tinyLog;
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
│  4 │ zl   │
└────┴──────┘
查看底层存储没有标记块文件夹



二.Log引擎

  1. 底层存储的文件中,

    *.bin

    存储每个字段的数据
  2. 底层存储的文件中,

    mark.mrk

    数据块标记
  3. 支持多线程处理
  4. 并发读写
create table tb_Log(
id UInt8,
name String
)engine=Log;

insert into tb_Log values(1,'zs'),(2,'ls'),(3,'ww');
select * from tb_Log;
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘

insert into tb_Log values(1,'zs'),(2,'ls'),(3,'ww');  //追加写入
select * from tb_Log;
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘

insert into tb_Log select * from tb_Log;   //并发读写
select * from tb_Log;
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘



三.StripeLog引擎

  1. 底层存储的文件中,

    data.bin

    存储所有数据
  2. 底层存储的文件中,

    index.mrk

    对数据建立索引
  3. 底层存储的文件中,

    size.json

    数据大小
  4. 并发读写
create table tb_stripeLog(
id UInt8,
name String
)engine=StripeLog;

insert into tb_stripeLog values(1,'zs'),(2,'ls'),(3,'ww');
select * from tb_stripeLog;
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘

insert into tb_stripeLog values(1,'zs'),(2,'ls'),(3,'ww');   //追加写入
select * from tb_stripeLog;
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ zs   │
│  2 │ ls   │
│  3 │ ww   │
└────┴──────┘



Log和StripeLog引擎支持

  • 并发访问数据的锁
  • insert请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除,如果没有写数据的请求,任意数量的读请求都可以并发执行。
  • 并行读取数据。
  • 在读数据时,clickhouse使用多线程,每个线程处理不同的数据块
  • Log引擎为表中的每一列使用不同的文件,StripeLog将所有的数据存储在一个文件中,因此StripeLog引擎在操作系统中使用更少的描述符,但是Log引擎提供更高的读性能。
  • TinyLog引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TinyLog引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中,它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和Log引擎同样多的描述符,可以在简单的低负载的情境下使用



版权声明:本文为nayomi927原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。