目前ClickHouse的表引擎主要有下面四个系列,合并树家族、日志引擎系列、集成的表引擎和其他特殊的引擎。
合并树家族
Clickhouse中最强大的表引擎当属MergeTree(合并树)引擎及该系列(MergeTree)中的其他引擎。
MergeTree系列的引擎被设计用于插入极大量的数据到一张表当中。数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。
主要特点
- 存储的数据按主键排序。这使得您能够创建一个小型的稀疏索引来加快数据检索。
- 如果指定了分区键的话,可以使用分区。在相同数据集和相同结果集的情况下ClickHouse中某些带分区的操作会比普通操作更快。查询中指定了分区键时ClickHouse会自动截取分区数据。这也有效增加了查询性能。
- 支持数据副本。ReplicatedMergeTree系列的表提供了数据副本功能。
- 支持数据采样。需要的话,您可以给表设置一个采样方法。
日志引擎系列
这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。
这系列的引擎有:
- StripeLog
- 日志
- TinyLog
共同属性
- 数据存储在磁盘上。
- 写入时将数据追加在文件末尾。
- 不支持突变操作。
- 不支持索引。这意味着
SELECT
在范围查询时效率不高。 - 非原子地写入数据。如果某些事情破坏了写操作,例如服务器的异常关闭,你将会得到一张包含了损坏数据的表。
当然他们之间也会有差异。
主要差异点
- Log和StripeLog引擎支持:
- 并发访问数据的锁。
INSERT
请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除。如果没有写数据的请求,任意数量的读请求都可以并发执行。 - 并行读取数据。在读取数据时,ClickHouse使用多线程。每个线程处理不同的数据块。
- Log引擎为表中的每一列使用不同的文件。StripeLog将所有的数据存储在一个文件中。因此StripeLog引擎在操作系统中使用更少的描述符,但是Log引擎提供更高的读性能。
- TinyLog引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TinyLog引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中。它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和Log引擎同样多的描述符。你可以在简单的低负载的情景下使用它。
集成的表引擎
ClickHouse 提供了多种方式来与外部系统集成,包括表引擎。像所有其他的表引擎一样,使用CREATE TABLE或ALTER TABLE查询语句来完成配置。然后从用户的角度来看,配置的集成看起来像查询一个正常的表,但对它的查询是代理给外部系统的。这种透明的查询是这种方法相对于其他集成方法的主要优势之一,比如外部字典或表函数,它们需要在每次使用时使用自定义查询方法。
以下是支持的集成方式:
- ODBC
- JDBC
- MySQL
- MongoDB
- HDFS
- S3
- Kafka
- EmbeddedRocksDB
- RabbitMQ
- PostgreSQL
- SQLite
- Hive
其他特殊的引擎
其他的表引擎用于特定的场景。具体使用什么引擎要根据具体的需求来分析。这里我们简单说一下有哪些表引擎,具体使用情况,我们后面再更新。
- 分布式引擎:分布式引擎本身不存储数据,但可以在多个服务器上进行分布式查询。读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。
- 关联表引擎:使用JOIN操作的一种可选的数据结构。Join表的数据总是保存在内存中。当往表中插入行记录时,CH会将数据块保存在硬盘目录中,这样服务器重启时数据可以恢复。如果服务器非正常重启,保存在硬盘上的数据块会丢失或被损坏。这种情况下,需要手动删除被损坏的数据文件。简单来说,这个是一种对join操作的优化的引擎。
- 内存表:Memory 引擎以未压缩的形式将数据存储在RAM中。数据完全以读取时获得的形式存储。换句话说,从这张表中读取是很轻松的。并发数据访问是同步的。锁范围小:读写操作不会相互阻塞。不支持索引。查询是并行化的。在简单查询上达到最大速率(超过10GB/秒),因为没有磁盘读取,不需要解压缩或反序列化数据。(值得注意的是,在许多情况下,与 MergeTree 引擎的性能几乎一样高)。重新启动服务器时,表中的数据消失,表将变为空。通常,使用此表引擎是不合理的。但是,它可用于测试,以及在相对较少的行(最多约100,000,000)上需要最高性能的查询。
- 随机数生成表引擎:随机数生成表引擎为指定的表模式生成随机数。
- 缓冲区:缓冲数据写入RAM中,周期性地将数据刷新到另一个表。在读取操作时,同时从缓冲区和另一个表读取数据。
- 字典:Dictionary引擎将字典数据展示为一个ClickHouse的表。
- 用于查询处理的外部数据:ClickHouse允许向服务器发送处理查询所需的数据以及SELECT查询。这些数据放在一个临时表中,可以在查询中使用(例如,在IN操作符中)。
- 文件(输入格式):数据源是以Clickhouse支持的一种输入格式(TabSeparated,Native等)存储数据的文件。
- MaterializedView:物化视图,视图的数据会物化到数据盘。
- 合并:Merge引擎(不要跟MergeTree引擎混淆)本身不存储数据,但可用于同时从任意多个其他的表中读取数据。读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表的索引(如果有的话)会被使用。
- Null:当写入Null类型的表时,将忽略数据。从Null类型的表中读取时,返回空。
- 集合:始终存在于RAM中的数据集。它适用于IN运算符的右侧。
- URL:用于管理远程HTTP/HTTPS服务器上的数据。该引擎类似文件引擎。
- 视图:它不存储数据,仅存储指定的SELECT查询。从表中读取时,它会运行此查询(并从查询中删除所有不必要的列)。
系列文章
张飞的猪大数据精选
来源文章:ClickHouse(08)ClickHouse表引擎概况