一、基本介绍
ClickHouse像MySQL一样提供了丰富的引擎;不同的引擎代表不同的类型,比如拥有何种特性、数据以何种形式被存储以及如何被加载。
二、数据库引擎
2.1 Ordinary
默认引擎,此数据库可以使用任意表引擎。
2.2 Dictionary
字典引擎,此数据库会为所有数据字典创建数据表。
2.3 Memory
内存引擎,此数据库中的表只存放在内存中,重启丢失。
2.4 Lazy
日志引擎,此数据库只能使用Log系列的表引擎。
2.5 MySQL
MySQL引擎,此数据库可以自动拉取远端MySQL数据(类似于Oracle的dblink,可以对远程表进行读写)
三、数据表引擎
3.1 MergreTree系列
该引擎是官方主推的存储引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,ReplacingMergeTree有了去重功能,SummingMergeTree有了汇总求和功能,AggregatingMergeTree有聚合功能,CollapsingMergeTree有折叠删除功能,VersionedCollapsingMergeTree有版本折叠功能,GraphiteMergeTree有压缩汇总功能。在这些的基础上还可以叠加Replicated和Distributed。
3.1.1 ReplacingMergeTree
1、使用order by排序键作为判断重复数据的唯一键;
2、只有在合并分区的时候才会触发删除重复数据的逻辑;
3、以数据分区为单位删除数据。当分区合并时,同一分区内的重复数据会被删除,不同分区之间的重复数据不会被删除;
4、在进行数据去重时,因为分区内的数据已经基于 order by进行了排序,所以能够找到那些相邻的重复数据。
数据去重策略有两种:
- 如果没有设置版本号,则保留同一组重复数据中的最后一行。
- 如果设置了版本号,则保留同一组重复数据中ver字段取值最大的那一行
3.1.2 SummingMergeTree
1、用order by排序键作为聚合数据的条件key
2、只有在合并分区的时候才会触发聚合计算的逻辑
3、以数据分区为单位来聚合数据。当分区合并时,同一数据分区内聚合key相同的数据会被合并汇总,而不同分区之间的数据则不会被汇总。
4、如果在定义引擎时指定了columns汇总列(非主键的数值类型字段),则sum汇总这些列字段,如果未指定,则聚合所有非主键数值字段。
5、在进行数据汇总时,因为分区内的数据已经基于order by排序,所以能够找到相邻且拥有相同聚合key的数据。
6、在汇总数据时,同一分区内相同聚合key的多行数据会合并成一行。其中汇总字段会进行sum计算;对于那些非汇总字段,则会使用第一行数据的取值。
7、支持嵌套结构,但字段名称必须以map后缀结尾。嵌套类型中,默认以第一个字段为聚合key。除第一个字段意外,任何名称以key,id或type为后缀结尾的字段,都将和第一个字段组合成复合key。
3.1.3 AggregatingMergeTree
1、用order by排序键作为聚合数据的条件key
2、使用AggregateFunction字段类型定义聚合函数的类型以及聚合字段。
3、只有在合并分区的时候才会触发聚合计算的逻辑
4、以数据分区为单位来聚合数据,当分区合并时,同一分区内聚合key相同的数据会被合并计算,而不同分区之间的数据则不会被计算。
5、在进行数据计算时,因为分区内的数据已经基于order by排序,所以能够找到相邻且拥有相同聚合key的数据。
6、在聚合数据时,同一分区内相同聚合key的多行数据会合并成一行。对于非主键、非AggregateFunction字段,则会使用第一行数据的取值
7、AggregateFunction字段使用二进制存储,写入数据时,需要调用State函数;而在查询数据时,则需要调用相应的Merge函数。其中,*表示定义时使用的聚合函数
8、AggregateMergeTree通常作为物化视图的表引擎,与普通MergeTree搭配使用。
3.1.4 CollapsingMergeTree(VersionedCollapsingMergeTree)
CollapsingMergeTree(VersionedCollapsingMergeTree) 会异步的删除(折叠)这些除了特定列 Sign 有 1 和 -1 的值以外,其余所有字段的值都相等的成对的行。没有成对的行会被保留。该引擎可以显著的降低存储量并提高 SELECT 查询效率。
3.1.5 GraphiteMergeTree
该引擎用来对 Graphite数据进行瘦身及汇总。
3.2 Log系列
1、数据被顺序append写到磁盘上
2、不支持delete、update
3、不支持索引
4、不支持原子写
5、插入阻塞查询
3.2.1 TinyLog
不支持并发读取,性能差,格式简单,适用存储中间数据
3.2.2 Log
支持并发读取,每个列存储在单独文件中,性能较好
3.2.3 StripeLog
支持并发读取,所有列存放在一个文件中,性能较好
3.3 Integration系列
该系列用于集成外部的数据源 。
3.3.1 HDFS
3.3.2 MySQL
3.3.3 Kafka
3.3.4 RabbitMQ
3.3.5 JDBC
3.3.6 ODBC
3.4 Special系列
3.4.1 Memory
数据存储在内存,重启数据丢失,读写不阻塞,不支持索引。
3.4.2 Merge
在同一个server上把多张相同结构的物理表合并为一张逻辑表。
3.4.3 Distrbuted
在不同的server上把多张相同结构的物理表合并为一张逻辑表。