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进行分区,
    支持副本备份
    支持数据抽样
    支持多线程查询,通过多版本实现,并不使用锁
    支持TTL

    Replicated

    如果一个表的引擎属于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在不同的场景下更加快速。

posted @ 2020-04-21 17:22  飞奔的普朗克  阅读(153)  评论(0)    收藏  举报