一、表引擎即表的类型
特性:
数据的存储方式和位置,写到哪里以及从哪里读取数据
支持哪些查询以及如何支持
并发数据访问
索引的使用(如果存在)
是否可以执行多线程请求
数据复制参数
1、日志引擎
写入许多小的数据量(少于100万行)的表场景
共性:
数据存储在磁盘上
写入时将数据追加在文件末尾
不支持突变操作
不支持索引
select在范围查询时效率不高
非原子地写入数据
某些事情破坏了写操作,例如:服务器异常关闭,表会损坏
差异:
Log和StripeLog引擎支持:
并发访问数据的锁
`INSERT` 请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除。如果没有写数据的请求,任意数量的读请求都可以并发执行。
并行读取数据
在读取数据时,ClickHouse 使用多线程。 每个线程处理不同的数据块。
1)TinyLog
数据存储在磁盘上,每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。
并发数据访问不受任何限制:
如果同时从表中读取并在不同的查询中写入,则读取操作将抛出异常。
如果同时写入多个查询中的表,则数据将会被破坏
特性:适用于一次写入多次读取,不支持索引
适合:小批量处理的中间数据
2)StripeLog
创建表:[if not exists] 可选项,如果表不存在则创建
create table if not exists ttt (id Int8,name String) engine=StripeLog;
写数据:
将所有列写在一个文件中,数据追加在表文件的末尾,逐列写入
文件格式:
data.bin --数据文件
index.mrk --带标记文件,存储带有每个数据块每列的偏移量
不支持alter update、alter delete
读数据:
并行读取数据,select返回数据顺序不可知,可以用order by排序
插入数据:
insert 每次都会在data.bin中创建一个新的数据块
3)Log
适用于临时数据
每列分开存储,可以多个线程读取表中的数据
并发数据访问,可以同时支持读取操作,而写入操作则会堵塞读取和其它写入
不支持索引