表引擎是clickhouse设计实现中的一大特色表引擎(即表的类型)决定了
   
- 数据的存储方式和位置,写到哪里以及从哪里读取数据
- 支持哪些查询以及如何支持
- 并发数据访问
- 索引的使用(如果存在)
- 是否可以执行多线程请求
- 数据复制参数,是否可以存储数据副本
- 分布式引擎实现分布式
    
    
    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引擎
   
- 
     底层存储的文件中,
 
 *.bin
 
 存储每个字段的数据
- 
     底层存储的文件中,
 
 mark.mrk
 
 数据块标记
- 支持多线程处理
- 并发读写
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引擎
   
- 
     底层存储的文件中,
 
 data.bin
 
 存储所有数据
- 
     底层存储的文件中,
 
 index.mrk
 
 对数据建立索引
- 
     底层存储的文件中,
 
 size.json
 
 数据大小
- 并发读写
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 版权协议,转载请附上原文出处链接和本声明。
