文章目录
- 0. 引言
- 1. 什么是表引擎
- 2. 不同表引擎使用场景
- 1. MergeTree:
- 2. Log:
- 3. Memory:
- 4. Distributed:
- 5. Kafka:
- 6. MaterializedView:
- 7. File和URL:
- 3. MergeTree 家族
- 3.1. MergeTree:
- 3.2. ReplacingMergeTree:
- 3.3. SummingMergeTree:
- 3.4. AggregatingMergeTree:
- 3.5. CollapsingMergeTree:
- 3.6. VersionedCollapsingMergeTree:
- 4. Log 家族
- 4.1. TinyLog:
- 4.2. StripeLog:
- 4.3. Log:
- 5. Memory 和 File 家族
- 5.1. Memory:
- 5.1.2. File:
- 6. Null 家族
- 7. 外部数据表引擎(MySQL, HDFS, URL, etc.)
- 7.1. MySQL:
- 7.2. HDFS:
- 7.3. URL:
- 引擎类型
- MergeTree {#mergetree}
- 日志
- 集成引擎 {#integration-engines}
- 用于其他特定功能的引擎 {#yong-yu-qi-ta-te-ding-gong-neng-de-yin-qing}
- 虚拟列
- 参考文档
0. 引言
ClickHouse的一大特性就是其表引擎,表引擎决定了如何存储数据,以及如何处理对数据的读写操作。在ClickHouse中,每张表都由一个表引擎支持,而且在创建表的时候就需要指定其表引擎。
ClickHouse有很多类型的表引擎,包括基于磁盘存储的表引擎如MergeTree系列(MergeTree、ReplacingMergeTree、SummingMergeTree等)、Log系列(TinyLog、StripedLog、Log)等,也有基于内存存储的表引擎如Memory。每种表引擎都有其适用的场景和特性,例如,MergeTree系列是最常用的表引擎,适用于大量数据的存储和分析,而Memory引擎则适用于存储少量临时数据。
了解和选择合适的表引擎是使用ClickHouse进行高效数据分析的关键。接下来,我们将详细介绍各种类型的表引擎,以及它们的应用场景和限制。
1. 什么是表引擎
表引擎(Table Engine)是一种数据库管理系统中的关键部分,负责存储数据、读取数据和处理数据查询。不同的表引擎具有不同的性能特性和适用范围。
在某些数据库系统中,例如MySQL,你可以为每个表选择不同的表引擎,包括InnoDB,MyISAM,Memory等。这些表引擎在功能、性能、并发能力、恢复能力等方面都有所不同。
在ClickHouse中,表引擎的选择将影响数据的存储格式、索引的使用、并发控制机制、是否支持数据复制等许多重要的方面。
表引擎(即表的类型)决定了什么
- 数据的存储方式和位置,写到哪里以及从哪里读取数据
- 支持哪些查询以及如何支持。
- 并发数据访问。
- 索引的使用(如果存在)。
- 是否可以执行多线程请求。
- 数据复制参数。
2. 不同表引擎使用场景
1. MergeTree:
说明:MergeTree是ClickHouse的主要表引擎,支持索引和数据分区,适用于大数据计算。
使用场景:适用于大数据分析,如用户行为分析、日志分析等。
示例:
CREATE TABLE example_merge_tree
(date Date,id UInt32,value String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;
2. Log:
说明:Log表引擎用于存储日志和其他机器数据。不支持索引和数据分区。
使用场景:适用于小数据量的日志和其他机器数据的存储。
示例:
CREATE TABLE example_log
(event_time DateTime,event_type String,event_data String
) ENGINE = Log;
3. Memory:
说明:Memory表引擎将所有数据存储在RAM中,适用于临时表和小数据量。
使用场景:适用于需要快速访问和计算的小数据量场景。
示例:
CREATE TABLE example_memory
(key UInt32,value String
) ENGINE = Memory;
4. Distributed:
说明:Distributed表引擎用于在多个节点间分布查询和数据。它自动分发查询和数据到所有节点。
使用场景:适用于需要在多个节点间进行数据分析的分布式场景。
示例:
CREATE TABLE example_distributed
(date Date,id UInt32,value String
) ENGINE = Distributed('my_cluster', 'my_database', 'example_merge_tree', rand());
5. Kafka:
说明:Kafka表引擎用于和Kafka集成,可用于实时数据流处理。
使用场景:适用于实时数据处理,如日志实时处理、实时数据分析等。
示例:
CREATE TABLE example_kafka
(event_time DateTime,event_type String,event_data String
) ENGINE = Kafka()
SETTINGSkafka_broker_list = 'localhost:9092',kafka_topic_list = 'test_topic',kafka_group_name = 'test_group',kafka_format = 'JSONEachRow',kafka_num_consumers = 2;
6. MaterializedView:
说明:MaterializedView引擎用于预处理数据,可以提高查询性能。
使用场景:适用于需要对大数据进行预处理以提高查询性能的场景。
示例:
CREATE MATERIALIZED VIEW example_mv
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
AS
SELECTdate,id,count() AS count
FROM example_merge_tree
GROUP BY date, id;
7. File和URL:
说明:File和URL表引擎用于对文件进行操作,例如CSV、Parquet等。
使用场景:适用于需要对文件进行操作的场景,如ETL操作、数据导入导出等。
示例:
CREATE TABLE example_file
(id UInt32,value String
) ENGINE = File(CSV, '/path/to/your/csv_file.csv');CREATE TABLE example_url
(id UInt32,value String
) ENGINE = URL('http://example.com/data.csv', CSV);
3. MergeTree 家族
ClickHouse的MergeTree家族引擎是一组支持实时数据更新、查询和数据合并功能的表引擎。这些引擎为大数据场景提供了高性能的解决方案。以下是MergeTree家族的主要成员及其使用场景。
MergeTree家族引擎根据不同的业务场景提供了多种实时数据处理功能,为大数据场景下的实时计算提供了强大的支持。在进行数据建模时,可以根据具体需求选择合适的MergeTree引擎。
3.1. MergeTree:
说明:MergeTree是ClickHouse的基本表引擎,支持索引和数据分区。
使用场景:适用于大数据分析,如用户行为分析、日志分析等。
示例:
CREATE TABLE example_merge_tree
(date Date,id UInt32,value String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;
3.2. ReplacingMergeTree:
说明:ReplacingMergeTree用于实时删除重复数据。当合并过程中发现相同的主键数据时,只保留最新的一条记录。
使用场景:适用于需要实时删除重复数据的场景,如实时去重、数据清洗等。
示例:
CREATE TABLE example_replacing_merge_tree
(date Date,id UInt32,value String
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;
3.3. SummingMergeTree:
说明:SummingMergeTree用于实时对数值型字段进行求和。在合并过程中,具有相同主键的记录将被合并为一条记录,并对指定字段求和。
使用场景:适用于需要对数值型字段进行实时求和的场景,如计数器、流量统计等。
示例:
CREATE TABLE example_summing_merge_tree
(date Date,id UInt32,value UInt32
) ENGINE = SummingMergeTree(value)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;
3.4. AggregatingMergeTree:
说明:AggregatingMergeTree用于实时对数据进行聚合。在合并过程中,具有相同主键的记录将被聚合为一条记录,根据指定的聚合函数进行计算。
使用场景:适用于需要实时聚合数据的场景,如统计、报表等。
示例:
CREATE TABLE example_aggregating_merge_tree
(date Date,id UInt32,value UInt32,countState AggregateFunction(count)
) ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;
3.5. CollapsingMergeTree:
说明:CollapsingMergeTree用于实时删除重复数据。不同于ReplacingMergeTree,它使用一个名为Sign的列来表示记录的状态(1表示插入,-1表示删除)。在合并过程中,符号相反且其他列相同的记录会被抵消。
使用场景:适用于需要实时删除重复数据的场景,如数据同步、状态更新等。
示例:
CREATE TABLE example_collapsing_merge_tree
(date Date,id UInt32,value String,sign Int8
) ENGINE = CollapsingMergeTree(sign)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;
3.6. VersionedCollapsingMergeTree:
说明:VersionedCollapsingMergeTree与CollapsingMergeTree类似,但它还使用一个名为Version的列来表示记录的版本。在合并过程中,版本较新的记录会覆盖版本较旧的记录。
使用场景:适用于需要实时删除重复数据并支持版本控制的场景,如数据历史记录、状态更新等。
示例:
CREATE TABLE example_versioned_collapsing_merge_tree
(date Date,id UInt32,value String,sign Int8,version UInt32
) ENGINE = VersionedCollapsingMergeTree(sign, version)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
SETTINGS index_granularity = 8192;
4. Log 家族
ClickHouse的Log家族引擎是一组专门用于大数据日志处理的表引擎。这些引擎能够快速地处理大量日志数据,并以极高的性能对其进行查询。以下是Log家族的主要成员及其使用场景。
4.1. TinyLog:
说明:TinyLog是一种非常简单的引擎,它将所有列保存在一个文件中。不支持索引,所以查询速度较慢,但是插入速度快。
使用场景:适用于小型数据集和日志记录。
示例:
CREATE TABLE example_tinylog
(date Date,id UInt32,value String
) ENGINE = TinyLog;
4.2. StripeLog:
说明:StripeLog在存储结构上类似于TinyLog,但是数据分为几个部分(stripes)进行存储,每个stripe对应一个块(block)。不支持索引。
使用场景:适用于较大的日志记录。
示例:
CREATE TABLE example_stripelog
(date Date,id UInt32,value String
) ENGINE = StripeLog;
4.3. Log:
说明:Log是一种简单的引擎,它把每一列的数据分别存储在不同的文件中。不支持索引,适用于大量的日志数据。
使用场景:适合大量的日志记录和流数据。
示例:
CREATE TABLE example_log
(date Date,id UInt32,value String
) ENGINE = Log;
总结:Log家族引擎特别适合处理大量的日志数据,能够以极高的效率插入和查询数据。但是由于这些引擎不支持索引,所以查询性能会比MergeTree家族的引擎要差一些。在进行数据建模时,可以根据数据量和查询需求选择合适的Log引擎。
5. Memory 和 File 家族
ClickHouse中的Memory和File家族引擎分别用于在内存和文件系统中存储数据。以下是Memory和File家族的主要成员及其使用场景。
5.1. Memory:
说明:Memory引擎将所有数据存储在内存中。它支持实时查询,并且具有极高的查询速度。但是,由于它将所有数据保存在内存中,因此在服务器重启或崩溃时,数据会丢失。
使用场景:适用于需要快速查询的小型数据集,如缓存、临时表或实时分析。
示例:
CREATE TABLE example_memory
(date Date,id UInt32,value String
) ENGINE = Memory;
5.1.2. File:
说明:File引擎将数据保存在服务器的文件系统中。它支持将数据存储为各种文件格式(如CSV、Parquet、JSON等)。File引擎不支持索引,因此查询速度较慢。
使用场景:适用于需要将数据以特定文件格式存储的场景,如ETL操作、数据备份或离线分析。
示例:
CREATE TABLE example_file
(date Date,id UInt32,value String
) ENGINE = File(CSV);
总结:Memory和File家族引擎分别用于内存和文件系统中的数据存储。Memory引擎具有非常高的查询速度,适用于实时查询,但数据在服务器重启或崩溃时会丢失。File引擎适用于需要将数据存储为特定文件格式的场景,但查询速度较慢。在进行数据建模时,可以根据数据存储需求和查询需求选择合适的Memory或File引擎。
6. Null 家族
Null家族是ClickHouse中的一个特殊的表引擎家族,它基本上不会执行任何操作或存储任何数据。以下是Null家族的主要成员及其使用场景:
- Null:
说明:Null引擎不保存数据,并且不对数据进行任何操作。当你往这个表里面插入数据时,数据会被直接丢弃。对于从这个表中的查询,它总是返回一个空结果。
使用场景:Null引擎主要用于调试或测试,例如,你可能想要测试插入或查询的性能,而不实际保存任何数据。另一个常见用例是作为一个"黑洞"表,用来快速丢弃不需要的数据。
示例:
CREATE TABLE example_null
(date Date,id UInt32,value String
) ENGINE = Null;
总结:Null家族引擎基本上不执行任何操作,也不保存任何数据。尽管Null引擎在生产环境中的应用可能有限,但在调试和测试中可能很有用。
7. 外部数据表引擎(MySQL, HDFS, URL, etc.)
ClickHouse支持外部数据表引擎,这些引擎可以让你以类似于操作本地表的方式访问外部数据源。以下是一些常见的外部数据表引擎及其特点:
7.1. MySQL:
说明:MySQL表引擎允许你将MySQL数据库中的数据表作为ClickHouse本地表进行操作。这使得你可以方便地在ClickHouse中查询MySQL表数据。
使用场景:当你需要在ClickHouse中查询MySQL中的数据时,MySQL表引擎非常有用。
示例:
CREATE TABLE mysql_table
(id UInt32,name String,age UInt8
) ENGINE = MySQL('host:port', 'database_name', 'table_name', 'user', 'password');
7.2. HDFS:
说明:HDFS表引擎可以让你将Hadoop分布式文件系统(HDFS)中的数据表作为ClickHouse本地表进行操作。它支持各种文件格式,如Parquet、ORC、Avro等。
使用场景:当你需要在ClickHouse中查询HDFS中的数据时,HDFS表引擎非常有用。
示例:
CREATE TABLE hdfs_table
(id UInt32,name String,age UInt8
) ENGINE = HDFS('hdfs://host:port/path/to/data/file.parquet', 'Parquet');
7.3. URL:
说明:URL表引擎可以让你将远程文件(通过HTTP或HTTPS访问)作为ClickHouse本地表进行操作。它支持各种文件格式,如CSV、TSV、JSON等。
使用场景:当你需要在ClickHouse中查询远程文件中的数据时,URL表引擎非常有用。
示例:
CREATE TABLE url_table
(id UInt32,name String,age UInt8
) ENGINE = URL('https://example.com/data.csv', 'CSV', 'id UInt32, name String, age UInt8');
总结:外部数据表引擎可以让你方便地访问外部数据源,如MySQL、HDFS或URL等。这使得在ClickHouse中整合和查询多种数据源变得简单。
引擎类型
MergeTree {#mergetree}
适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。 MergeTree系列引擎支持数据复制(使用Replicated* 的引擎版本),分区和一些其他引擎不支持的其他功能。
该类型的引擎:
- MergeTree
- ReplacingMergeTree
- SummingMergeTree
- AggregatingMergeTree
- CollapsingMergeTree
- VersionedCollapsingMergeTree
- GraphiteMergeTree
日志
具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。
该类型的引擎:
- TinyLog
- StripeLog
- Log
集成引擎 {#integration-engines}
用于与其他的数据存储与处理系统集成的引擎。
该类型的引擎:
- Kafka
- MySQL
- ODBC
- JDBC
- HDFS
用于其他特定功能的引擎 {#yong-yu-qi-ta-te-ding-gong-neng-de-yin-qing}
该类型的引擎:
- Distributed
- MaterializedView
- Dictionary
- Merge
- File
- Null
- Set
- Join
- URL
- View
- Memory
- Buffer
虚拟列
虚拟列是表引擎组成的一部分,它在对应的表引擎的源代码中定义。
您不能在 CREATE TABLE
中指定虚拟列,并且虚拟列不会包含在 SHOW CREATE TABLE
和 DESCRIBE TABLE
的查询结果中。虚拟列是只读的,所以您不能向虚拟列中写入数据。
如果想要查询虚拟列中的数据,您必须在SELECT查询中包含虚拟列的名字。SELECT *
不会返回虚拟列的内容。
若您创建的表中有一列与虚拟列的名字相同,那么虚拟列将不能再被访问。我们不建议您这样做。为了避免这种列名的冲突,虚拟列的名字一般都以下划线开头。
参考文档
- Yandex ClickHouse官方文档: https://clickhouse.tech/
- ClickHouse表引擎介绍: https://clickhouse.tech/docs/en/engines/table-engines/
- ClickHouse的表引擎选择: https://www.jianshu.com/p/752c1f8b38e7
- ClickHouse的数据存储和计算原理: https://www.jianshu.com/p/a1d3d6e1f76a
- ClickHouse表引擎深入理解: https://zhuanlan.zhihu.com/p/142616461