【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
clickhouse 表引擎
-
MergeTree 类型
- MergeTree(合并树)
主要特点:
- 存储按主键排序的数据。 这使您可以创建一个小的稀疏索引,以帮助更快地查找数据。
- 如果指定了分区键,则可以使用分区。 ClickHouse支持某些分区操作,这些操作比对相同数据,相同结果的常规操作更有效。 ClickHouse还会自动切断在查询中指定了分区键的分区数据。这也提高了查询性能。
- 数据复制支持。 ReplicatedMergeTree表族提供数据复制。有关更多信息,请参见数据复制。
- 数据采样支持。 如有必要,可以在表中设置数据采样方法。
- 参考链接
该MergeTree系列(*MergeTree)的引擎和其他引擎是最强大的ClickHouse表引擎。
该MergeTree系列中的引擎旨在将大量数据插入表中。数据迅速地逐部分写入表中,然后应用规则在后台合并这些部分。这种方法比插入期间连续重写存储中的数据效率更高。
- ReplacingMergeTree(替换合并树)
该引擎与MergeTree的不同之处在于,它删除具有相同主键值(或更准确地说,具有相同排序键值)的重复条目。
重复数据删除仅在合并期间发生。合并发生在后台的未知时间,因此您无法为此计划。某些数据可能仍未处理。尽管您可以使用OPTIMIZE查询运行计划外的合并,但不要指望使用它,因为OPTIMIZE查询将读取和写入大量数据。
因此,ReplacingMergeTree它适合于在后台清除重复数据以节省空间,但不能保证不存在重复数据。
- SummingMergeTree(求和合并树)
引擎从MergeTree继承。区别在于,在合并SummingMergeTree表的数据部分时,ClickHouse会将所有具有相同主键(或更准确地说,具有相同排序键)的行替换为一行,该行包含数字数据类型的列的汇总值。如果排序键的组成方式是单个键值对应于大量行,则这将大大减少存储量并加快数据选择的速度。
建议与一起使用引擎MergeTree。将完整数据存储在MergeTree表中,并SummingMergeTree用于汇总数据存储,例如,在准备报告时。这样的方法将防止您由于主键构成不正确而丢失有价值的数据。
- AggregatingMergeTree(合并合并树)
引擎继承自MergeTree,更改了数据部分合并的逻辑。ClickHouse用存储聚合函数状态组合的单行(在一个数据部分内)用相同的主键(或更准确地说,用相同的排序键)替换所有行。
您可以将AggregatingMergeTree表用于增量数据聚合,包括聚合的物化视图。
引擎处理所有具有AggregateFunction类型的列。
AggregatingMergeTree如果按顺序减少行数,则适合使用。
- CollapsingMergeTree(折叠合并树)
该引擎继承自MergeTree,并将折叠行的逻辑添加到数据部分合并算法中。
CollapsingMergeTree如果排序键(ORDER BY)中的所有字段都相等,则异步删除(折叠)成对的行,除了Sign可以具有1和-1值的特定字段。没有对的行将保留。有关更多详细信息,请参见文档的“ 折叠”部分。
引擎可以显着减少存储量并因此提高SELECT查询效率。
- VersionedCollapsingMergeTree
该引擎:
-
允许快速写入不断变化的对象状态。
-
删除背景中的旧对象状态。这大大减少了存储量。
-
有关详细信息,请参见“ 折叠 ”部分。
引擎继承自MergeTree,并将用于折叠行的逻辑添加到用于合并数据部分的算法中。VersionedCollapsingMergeTree具有与CollapsingMergeTree相同的目的,但是使用了不同的折叠算法,该算法允许以多个顺序以任何顺序插入数据。特别是,Version即使以错误的顺序插入行,该列也有助于正确折叠行。相反,CollapsingMergeTree仅允许严格连续插入。
- GraphiteMergeTree
该引擎旨在稀疏和汇总/平均(汇总)石墨数据。这对于希望将ClickHouse用作Graphite的数据存储的开发人员很有帮助。
如果不需要汇总,但是如果需要汇总使用,则可以使用任何ClickHouse表引擎来存储Graphite数据GraphiteMergeTree。该引擎减少了存储量并提高了从Graphite查询的效率。
引擎从MergeTree继承属性。
适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。 MergeTree系列引擎支持数据复制(使用Replicated* 的引擎版本),分区和一些其他引擎不支持的其他功能。
-
Log 类型
共同属性:
- 数据存储在磁盘上。
- 写入时将数据追加在文件末尾。
- 不支持突变操作。
- 不支持索引。这意味着 SELECT 在范围查询时效率不高。
- 非原子地写入数据。 如果某些事情破坏了写操作,例如服务器的异常关闭,你将会得到一张包含了损坏数据的表。
- TinyLog
最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中。写入时,数据将附加到文件末尾。
并发数据访问不受任何限制: - 如果同时从表中读取并在不同的查询中写入,则读取操作将抛出异常 - 如果同时写入多个查询中的表,则数据将被破坏。
这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。查询在单个流中执行。换句话说,此引擎适用于相对较小的表(建议最多1,000,000行)。如果您有许多小表,则使用此表引擎是适合的,因为它比Log引擎更简单(需要打开的文件更少)。当您拥有大量小表时,可能会导致性能低下,但在可能已经在其它 DBMS 时使用过,则您可能会发现切换使用 TinyLog 类型的表更容易。不支持索引。
- StripeLog
- Log
日志与 TinyLog 的不同之处在于,"标记" 的小文件与列文件存在一起。这些标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。这使得可以在多个线程中读取表数据。对于并发数据访问,可以同时执行读取操作,而写入操作则阻塞读取和其它写入。Log 引擎不支持索引。同样,如果写入表失败,则该表将被破坏,并且从该表读取将返回错误。Log 引擎适用于临时数据,write-once 表以及测试或演示目的。
具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。
差异
- 并发访问数据的锁。
- INSERT 请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除。如果没有写数据的请求,任意数量的读请求都可以并发执行。
- 并行读取数据。
- 在读取数据时,ClickHouse 使用多线程。 每个线程处理不同的数据块。
Log 引擎为表中的每一列使用不同的文件。StripeLog 将所有的数据存储在一个文件中。因此 StripeLog 引擎在操作系统中使用更少的描述符,但是 Log 引擎提供更高的读性能。
TingLog 引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TingLog 引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中。它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和 Log 引擎同样多的描述符。你可以在简单的低负载的情景下使用它。
-
Intergation engines 类型
- Kafka
- MySQL
- ODBC
- JDBC
- HDFS
用于与其他的数据存储与处理系统集成的引擎。 以上是其他数据存储类型引擎。
-
用于其他特定功能的引擎
- Distributed -- 分布式引擎
分布式引擎本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。 分布式引擎参数:服务器配置文件中的集群名,远程数据库名,远程表名,数据分片键(可选)
- MaterializedView -- 物化视图引擎
用于实现实例化视图(有关更多信息,请参见CREATE TABLE)。为了存储数据,它使用在创建视图时指定的其他引擎。从表中读取时,它仅使用此引擎。
- Dictionary -- 字典引擎
字典引擎将字典数据显示为ClickHouse表
- Merge -- 表合并引擎
合并引擎(不要与MergeTree混淆)不存储数据本身,但允许同时读取任何数量的其他表。读数自动并行化。不支持写入表。在读取时,如果存在,则使用实际正在读取的表的索引。合并引擎接受参数:数据库名称和表的正则表达式。
- File -- 文件引擎
File表引擎以一种受支持的文件格式(TabSeparated,Native等)将数据保存在文件中。
用法示例:
- 数据从ClickHouse导出到文件。
- 将数据从一种格式转换为另一种格式。
- 通过编辑磁盘上的文件来更新ClickHouse中的数据。
- Null -- 空值引擎
写入Null表时,数据将被忽略。从Null表读取时,响应为空。
但是,您可以在Null表上创建实例化视图。因此,写入表的数据将最终出现在视图中。
- Set
始终位于RAM中的数据集。它旨在在IN运算符的右侧使用(请参见“ IN运算符”部分)。
您可以使用INSERT将数据插入表中。新元素将添加到数据集,而重复项将被忽略。但是您不能从表中执行SELECT。检索数据的唯一方法是在IN运算符的右半部分使用它。
数据始终位于RAM中。对于INSERT,插入的数据块也将写入磁盘上表的目录中。启动服务器时,此数据将加载到RAM。换句话说,重新启动后,数据保留在原位。
对于服务器的重新启动,磁盘上的数据块可能会丢失或损坏。在后一种情况下,您可能需要手动删除数据损坏的文件。
- Join -- 表连接引擎
准备在JOIN操作中使用的数据结构。
- URL
管理远程HTTP / HTTPS服务器上的数据。该引擎类似于文件引擎。
- View -- 实现视图
用于实现视图(有关更多信息,请参见CREATE VIEW query)。它不存储数据,而仅存储指定的SELECT查询。从表中读取时,它将运行此查询(并从查询中删除所有不必要的列)。
- Memory -- 内存引擎
内存引擎以未压缩的形式将数据存储在RAM中。数据以与读取时完全相同的形式存储。换句话说,从该表中读取是完全免费的。并发数据访问已同步。锁很短:读和写操作不会互相阻塞。不支持索引。读取并行化。通过简单的查询,可以达到最高的生产率(超过10 GB /秒),因为无需从磁盘读取,解压缩或反序列化数据。(我们应该注意,在许多情况下,MergeTree引擎的生产率几乎一样高。)重新启动服务器时,数据从表中消失,并且表变为空。通常,使用此表引擎是不合理的。但是,它可以用于测试,
系统将内存引擎用于具有外部查询数据的临时表(请参见“用于处理查询的外部数据”部分),以及用于实现GLOBAL IN(请参见“ IN运算符”部分)
- Buffer -- 缓冲引擎
缓冲数据以写入RAM,并定期将其刷新到另一个表。在读取操作期间,同时从缓冲区和另一个表读取数据
来源:oschina
链接:https://my.oschina.net/u/2971292/blog/3144417