表引擎
表引擎(即表的类型)决定了:
- 数据的存储方式和位置,写到哪里以及从哪里读取数据。
- 支持哪些查询以及如何支持。
- 并发数据访问。
- 索引的使用(如果存在)。
- 是否可以执行多线程请求。
- 数据复制参数。
引擎类型
MergeTree
MergeTree是云数据库ClickHouse的主要存储引擎,按主键排序存储数据,支持索引、分区和复制,提供高速写入和实时分析查询。
该类型的引擎:
- MergeTree
- ReplacingMergeTree
- SummingMergeTree
- AggregatingMergeTree
- CollapsingMergeTree
- VersionedCollapsingMergeTree
- GraphiteMergeTree
日志
轻量级的小数据量存储,按插入顺序存储数据,无序,超高速写入,但没有索引。
该类型的引擎:
- TinyLog
- StripeLog
- Log
集成引擎
用于与其他的数据存储与处理系统集成的引擎。 该类型的引擎:
- Kafka
- MySQL
- ODBC
- JDBC
- HDFS
用于其他特定功能的引擎
该类型的引擎:
- Distributed
- MaterializedView
- Dictionary
- Merge
- File
- Null
- Set
- Join
- URL
- View
- Memory
- Buffer
虚拟列
虚拟列是表引擎组成的一部分,它在对应的表引擎的源代码中定义。
您不能在 CREATE TABLE
中指定虚拟列,并且虚拟列不会包含在 SHOW CREATE TABLE
和 DESCRIBE TABLE
的查询结果中。虚拟列是只读的,所以您不能向虚拟列中写入数据。
如果想要查询虚拟列中的数据,您必须在SELECT查询中包含虚拟列的名字。SELECT *
不会返回虚拟列的内容。
若您创建的表中有一列与虚拟列的名字相同,那么虚拟列将不能再被访问。我们不建议您这样做。为了避免这种列名的冲突,虚拟列的名字一般都以下划线开头。
合并树引擎示例
MergeTree
MergeTree引擎是云数据库ClickHouse的默认存储引擎,它适用于有序数据的快速插入和查询。MergeTree引擎以主键的方式组织数据,并支持按照主键范围进行数据分区和排序。这种组织方式使得MergeTree引擎在处理大量数据和快速查询时表现出色。
MergeTree引擎的主要特点和功能包括:
- 数据分区:MergeTree引擎将数据按照主键范围进行分区,每个分区都包含一个或多个数据块,以支持更高效的数据查询和压缩。
- 数据排序:数据在每个分区内按照主键进行排序,使得查询时可以利用主键范围进行快速定位和过滤。
- 索引:MergeTree引擎自动为主键创建索引,加速查询操作。
- 数据合并:当数据插入到MergeTree表时,如果与已有数据有重叠的主键范围,引擎会自动进行数据合并,保证数据的有序性和唯一性。
- 数据压缩:MergeTree引擎支持多种数据压缩算法,可以有效减少数据占用的磁盘空间,提高存储效率。
下面是一个使用MergeTree引擎创建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
在上述示例中,我们创建了一个名为my_table的表,它包含了日期(date)、ID(id)和值(value)三个列。使用MergeTree引擎,我们将数据按照日期进行分区(每个月一份数据),并按照日期和ID进行排序。这样可以加速按照日期范围和ID进行查询操作。
MergeTree引擎在数据查询和存储方面具有高效性和灵活性,适用于大数据量的分析和查询场景。
ReplacingMergeTree
ReplacingMergeTree引擎是云数据库ClickHouse的一种存储引擎,它是基于MergeTree引擎的一种变体。ReplacingMergeTree引擎用于处理带有版本控制的数据,允许在插入新数据时自动替换旧数据。这种引擎适用于需要保留最新数据版本并且可以删除旧数据的场景。
ReplacingMergeTree引擎的主要特点和功能包括:
- 版本控制:每条数据都带有版本信息,新插入的数据会替换旧版本的数据。
- 数据排序:数据按照主键范围进行排序,以支持快速查询和按照主键范围删除旧数据。
- 索引:引擎会为主键创建索引,提高查询和删除操作的效率。
- 数据合并:当新数据插入时,旧数据根据版本控制规则进行替换,保留最新的数据版本。
- 数据压缩:支持多种数据压缩算法,减少数据占用的磁盘空间。
下面是一个使用ReplacingMergeTree引擎创建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64,
version UInt32
)
ENGINE = ReplacingMergeTree(version)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
在上述示例中,我们创建了一个名为my_table的表,它包含了日期(date)、ID(id)、值(value)和版本(version)四个列。使用ReplacingMergeTree引擎,我们按照版本控制规则对数据进行插入和替换操作。表的数据按照日期进行分区(每个月一份数据),并按照日期和ID进行排序。
ReplacingMergeTree引擎适用于需要保留最新数据版本并进行版本控制的场景,例如日志记录、事件追踪等应用。它提供了方便的数据替换和删除功能,使得数据的更新和维护更加灵活和高效。
CollapsingMergeTree
CollapsingMergeTree引擎是云数据库ClickHouse的一种存储引擎,它是基于MergeTree引擎的一种变体。CollapsingMergeTree引擎用于处理具有相同主键值的数据,并将它们合并为一行。这种引擎适用于需要对数据进行聚合和压缩的场景。
CollapsingMergeTree引擎的主要特点和功能包括:
- 主键合并:具有相同主键值的行将被合并为一行,减少数据冗余和存储空间。
- 数据排序:数据按照主键范围进行排序,以支持快速查询和按照主键范围删除数据。
- 聚合函数:可以对合并后的行应用聚合函数,如SUM、MAX、MIN等,以获取合并后的结果。
- 索引:引擎会为主键创建索引,提高查询和删除操作的效率。
- 数据压缩:支持多种数据压缩算法,减少数据占用的磁盘空间。
下面是一个使用CollapsingMergeTree引擎创建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64,
flag Int8
)
ENGINE = CollapsingMergeTree(flag)
ORDER BY (date, id)
在上述示例中,我们创建了一个名为my_table的表,它包含了日期(date)、ID(id)、值(value)和标志(flag)四个列。使用CollapsingMergeTree引擎,并根据标志(flag)进行主键合并。表的数据按照日期和ID进行排序。
CollapsingMergeTree引擎适用于需要对具有相同主键值的数据进行合并和聚合的场景,例如事件统计、日志分析等应用。它能够减少数据冗余,提高查询效率,并支持各种聚合操作,为数据分析提供便利。
VersionedCollapsingMergeTree
VersionedCollapsingMergeTree引擎是云数据库ClickHouse的一种存储引擎,它是基于CollapsingMergeTree引擎的一种变体。VersionedCollapsingMergeTree引擎适用于需要对数据进行合并和聚合,并且需要保留历史版本的场景。
VersionedCollapsingMergeTree引擎的主要特点和功能包括:
- 主键合并:具有相同主键值的行将被合并为一行,减少数据冗余和存储空间。
- 数据排序:数据按照主键范围进行排序,以支持快速查询和按照主键范围删除数据。
- 聚合函数:可以对合并后的行应用聚合函数,如SUM、MAX、MIN等,以获取合并后的结果。
- 历史版本:VersionedCollapsingMergeTree引擎会保留历史版本的数据,可以按照版本进行查询和回溯。
- 索引:引擎会为主键创建索引,提高查询和删除操作的效率。
下面是一个使用VersionedCollapsingMergeTree引擎创建表的示例:
CREATE TABLE my_table
(
date Date,
id Int32,
value Float64,
flag Int8,
version UInt32
)
ENGINE = VersionedCollapsingMergeTree(8192, version)
PARTITION BY toYYYYMM(date)
ORDER BY (date, id)
在上述示例中,我们创建了一个名为my_table的表,它包含了日期(date)、ID(id)、值(value)、标志(flag)和版本(version)五个列。使用VersionedCollapsingMergeTree引擎,并根据版本(version)进行主键合并。表的数据按照日期和ID进行排序,并按照年月进行分区。
VersionedCollapsingMergeTree引擎适用于需要对具有相同主键值的数据进行合并和聚合,并且需要保留历史版本的场景,例如审计日志、数据变更记录等应用。它能够减少数据冗余,提供数据的历史版本查询和回溯功能,为数据分析和数据溯源提供便利。
AggregatingMergeTree
AggregatingMergeTree引擎是云数据库ClickHouse的一种存储引擎,用于对数据进行聚合操作和存储聚合结果。它适用于需要高效地进行聚合查询的场景,如数据分析、报表生成等。
AggregatingMergeTree引擎的主要特点和功能包括:
- 聚合操作:引擎会按照指定的聚合键对数据进行分组和聚合操作,例如SUM、MAX、MIN等。
- 存储聚合结果:引擎会存储聚合后的结果,而不是原始的细粒度数据,减少存储空间和提高查询性能。
- 数据排序:数据按照聚合键进行排序,以支持快速的聚合查询。
- 索引:引擎会为聚合键创建索引,提高聚合查询的效率。
下面是一个使用AggregatingMergeTree引擎创建表的示例:
CREATE TABLE my_table
(
date Date,
category String,
value Float64
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, category)
SETTINGS index_granularity = 8192
在上述示例中,我们创建了一个名为my_table的表,它包含了日期(date)、分类(category)和值(value)三个列。使用AggregatingMergeTree引擎,并根据日期和分类进行数据的聚合和排序。表的数据按照年月进行分区,并设置了索引的粒度为8192。
通过使用AggregatingMergeTree引擎,您可以将细粒度的数据进行聚合,并存储聚合结果,以提高查询性能和减少存储空间。这对于需要频繁进行聚合查询的场景非常有用,可以加快查询速度并节省存储成本。
SummingMergeTree
SummingMergeTree引擎是云数据库ClickHouse中的一种存储引擎,用于对数据进行聚合操作并存储聚合结果。它适用于需要对某些列进行求和聚合的场景,例如统计总和、平均值等。
SummingMergeTree引擎的主要特点和功能包括:
- 聚合操作:引擎会按照指定的聚合键对数据进行分组和聚合操作,例如对某列进行求和操作。
- 存储聚合结果:引擎会存储聚合后的结果,而不是原始的细粒度数据,减少存储空间和提高查询性能。
- 数据排序:数据按照聚合键进行排序,以支持快速的聚合查询。
- 索引:引擎会为聚合键创建索引,提高聚合查询的效率。
下面是一个使用SummingMergeTree引擎创建表的示例:
CREATE TABLE my_table
(
date Date,
category String,
value Float64
)
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (date, category)
SETTINGS index_granularity = 8192
在上述示例中,我们创建了一个名为my_table的表,它包含了日期(date)、分类(category)和值(value)三个列。使用SummingMergeTree引擎,并根据日期和分类进行数据的聚合和排序。表的数据按照年月进行分区,并设置了索引的粒度为8192。
通过使用SummingMergeTree引擎,您可以对某些列进行求和聚合,并存储聚合结果,以提高查询性能和减少存储空间。这对于需要频繁进行求和操作的场景非常有用,可以加快查询速度并节省存储成本。