ClickHouse入门学习-引擎篇
- 引擎的作用
数据存储和读取的位置
支持哪些查询方式
能否并发式访问数据
能不能使用索引
是否可以执行多线程请求
数据复制使用的参数
引擎分类
表引擎:MYSQL,LAZY,以及默认引擎。
MYSQL:
因为ck不仅仅是一个数据库而是一个DBMS,所以可以作为上层,底层链接MYSQL。
既然是在ck上操作,那么会有一些限制。
不能执行rename,create table,alter操作。
通过create database建立链接,具体代码如下:
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
同时会伴随这类型转换,因为ck跟MYSQL的数据类型是不一样的。具体参考官网。
LAZY:
这种数据库引擎是将数据存放在RAM中,并且加上了一个过期时间。从上次使用完毕之后开始计算,当达到了过期时间,那么数据就会删除。
内部tables的类型只能是*Log类型的,也就是专门为了存放小的日志类型的数据,当长时间不使用之后自动机就会被清理掉。
表引擎
从官方文档可以看到如下分类,在默认表引擎的前提下:
- MergerTree家族-最强盛(robust)的引擎家族
MergeTree
ReplacingMergeTree
SummingMergeTree
AggregatingMergeTree
CollapsingMergeTree
VersionedCollapsingMergeTree
GraphiteMergeTree - Log家族,只有很少的功能,主要用于快速写入很多小表,但后续需要整合的时候使用
TinyLog
StripeLog
Log - Integration 家族,主要用于与其他系统链接
Kafka
MySQL
ODBC
JDBC
HDFS - 特殊引擎家族
Distributed
Merge
Buffer
这个比较多,也比较琐碎,建议用到了再去官网查看。。
着重看了下MergeTree跟Log引擎家族。
MergeTree
文档中有说到,这个引擎家族就是为了向表中插入大量数据设计的。通过分块,快速写入,并在后台合并,这样比常用的存储方式更有效果。
通过主键存储,并创建稀疏索引(sparse),还有一种叫跳跃索引(skipping),其实就是把主键组合计算,这样形成折叠,就形成了跳跃。
通过分区key进行分区,
支持副本备份
支持数据抽样
支持多线程查询,通过多版本实现,并不使用锁
支持TTLReplicated
如果一个表的引擎属于MergeTree,那么可以为它制作副本,只要创建一个新的表,引擎类型为原表引擎的副本,如ReplicatedMergeTree是MergeTree的副本引擎。
副本是表级别的,不是分片级别的,不是服务级别的,一个服务器上可以存在副本跟非副本的表。
通过zk来存储表信息跟副本信息。
ReplacingMergeTree(version)
在mergeTree的基础上增加了主键去重功能。
去重发生在数据合并的过程,数据合并是在后台操作,完成时间是无法预料的,存在中间状态,可以使用OPTIMIZE关键子来手动触发,但是通常会产生大量的读写操作,所以不建议使用。
version参数用于去重的过程中取数据,是一个列名,如果参数为空,那么取最新一条数据,如果参数不为空,那么取version值最大的数据。SummingMergeTree([columns])
在mergeTree的基础上增加了根据主键叠加功能,叠加的列就是参数clolumns数组,要求值必须是数字类型,如果为空,那么叠加所有是数字类型的列。
同样也存在处理存在中间态的问题,所以还是需要正常的写sum,groupby这样的聚合函数。不会叠加主键。如果最终合并的列的结果都是0,那么会删除这条数据。
官方建议配合MergeTree一起用,先用MergeTree做存储,然后用SummingMergeTree做叠加累计。
如果是复杂类型,那么会看成map类型。要求key是数字类型比如时间,数字,value要求可计算叠加,那么就会根据key取合并,将value想加。
Aggregatingmergetree
在mergeTree的基础上,会合并具有相同主键的数据。这里要求插入数据的时候,列上是带有聚合函数的。可以理解为在完成插入之后,还会对主键相同的数据依据 集合函数进一步聚合。
在进行查询的时候都还是需要加上聚合函数的,因为也会出现中间态,用聚合函数保证数据的准确性。
CollapsingMergeTree(sign)
在mergeTree的基础上,增加数据异步删除合并功能,通过sign参数(取值为1,-1)。
可以理解为sign作为标志为,sign=1为有效数据,sign=-1代表为无效数据。
当需要修改一条数据,那么需要操作的是新增一条sign=-1,其他值不改变,实现相加抵消的效果。最后在新增最新的一条数据进去。
这里值得注意的是,因为是临近的两条数据相加抵消,所以对顺序有一个强依赖,所以只能严格顺序插入。
VersionedCollapsingMergeTree(sign, version)
做为CollapsingMergeTree的升级版,主要是提升了插入的效率,允许多进程插入。通过version进行版本控制,可以知道数据的时效性,解决了CollapsingTree对顺序插入的强依赖。
LOG家族
用于快速存储大量小文件,并且需要在后续以一个整体来阅读的情况。
数据都会以追加在末尾的形式存储在硬盘上。
不支持修改,不支持索引,不是原子写入,但是对于并发获取数据,对于读写请求通过锁控制。
Log 引擎为表中的每一列使用不同的文件。StripeLog 将所有的数据存储在一个文件中。因此 StripeLog 引擎在操作系统中使用更少的描述符,但是 Log 引擎提供更高的读性能。
TingLog 引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TingLog 引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中。它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和 Log 引擎同样多的描 述符。你可以在简单的低负载的情景下使用它。
Distributed
理解为逻辑表,本身并不存储数据,只是通过他来进行分布式查询操作,那么天然的并行操作,并且会使用索引。
Merge
本身也不存储数据,但是允许同时读取多张表的数据,类似与Distribute的本地版本,也是并行操作去读,但是不支持写入,读取会使用索引。
Buffer
先将数据存储在RAM中,然后周期性的刷到别的表中,读取也是相同的操作。也就是说会存在中间态。
最后,ck的引擎非常丰富,给不同的场景分配了不同的引擎,很多都采用了异步,多线程,索引,最终目的就是为了ck在不同的场景下更加快速。
浙公网安备 33010602011771号