【Clickhouse 探秘】Clikchouse 有哪些表引擎?你都知道哪些?

235 阅读4分钟

ClickHouse 提供了多种表引擎,每种引擎都有其特定的用途和优化目标。下面详细介绍几种常用的表引擎:

1. MergeTree 系列

1.1 MergeTree

特点

  • 最常用的表引擎,适用于大多数场景。
  • 支持分区和排序,可以显著提高查询性能。
  • 支持数据压缩,节省存储空间。
  • 支持数据的去重和合并。

使用场景

  • 大规模数据存储和分析。
  • 实时查询和报表生成。

我们来举个例子

CREATE TABLE my_table
(
    id UInt64,
    date Date,
    value Float64
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (id, date);

1.2 ReplacingMergeTree

特点

  • 继承自 MergeTree,支持数据去重。
  • 可以根据指定的列(通常是主键)删除重复的数据。

使用场景

  • 需要保证数据唯一性的场景。

我们来举个例子

CREATE TABLE my_table
(
    id UInt64,
    date Date,
    value Float64
)
ENGINE = ReplacingMergeTree(id)
PARTITION BY toYYYYMM(date)
ORDER BY (id, date);

1.3 SummingMergeTree

特点

  • 继承自 MergeTree,支持数据的自动汇总。
  • 适用于需要对某些列进行汇总的场景。

使用场景

  • 日志分析和统计报表。

我们来举个例子

CREATE TABLE my_table
(
    id UInt64,
    date Date,
    value Float64
)
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (id, date);

1.4 AggregatingMergeTree

特点

  • 继承自 MergeTree,支持复杂的聚合操作。
  • 适用于需要进行复杂聚合计算的场景。

使用场景

  • 复杂的聚合查询和数据预处理。

我们来举个例子

CREATE TABLE my_table
(
    id UInt64,
    date Date,
    value AggregateFunction(sum, Float64)
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY (id, date);

2. 日志系列

2.1 Log

特点

  • 简单的日志表引擎,适用于小数据量的临时存储。
  • 不支持索引和分区,查询性能较差。

使用场景

  • 调试和测试。

我们来举个例子

CREATE TABLE my_table
(
    id UInt64,
    value Float64
)
ENGINE = Log;

2.2 TinyLog

特点

  • 类似于 Log,但更适合小到中等规模的数据。
  • 支持多个文件存储,但仍然不支持索引和分区。

使用场景

  • 小规模数据的临时存储和调试。

我们来举个例子

CREATE TABLE my_table
(
    id UInt64,
    value Float64
)
ENGINE = TinyLog;

3. 分布式系列

3.1 Distributed

特点

  • 用于在多个 ClickHouse 服务器之间分布数据。
  • 支持跨节点的查询和数据分片。

使用场景

  • 大规模数据的分布式存储和查询。

我们来举个例子

CREATE TABLE my_distributed_table
(
    id UInt64,
    date Date,
    value Float64
)
ENGINE = Distributed(cluster_name, database_name, table_name, rand());

4. 内存系列

4.1 Memory

特点

  • 将数据存储在内存中,适用于需要极高性能的临时数据。
  • 数据在重启后会丢失。

使用场景

  • 缓存和临时数据存储。

我们来举个例子

CREATE TABLE my_table
(
    id UInt64,
    value Float64
)
ENGINE = Memory;

5. 特殊用途系列

5.1 Null

特点

  • 用于创建一个虚拟表,不存储任何数据。
  • 适用于测试和调试。

使用场景

  • 测试和调试。

我们来举个例子

CREATE TABLE my_null_table
(
    id UInt64,
    value Float64
)
ENGINE = Null;

5.2 File

特点

  • 从外部文件中读取数据,支持多种文件格式(如 CSV、JSON 等)。
  • 适用于一次性导入数据。

使用场景

  • 数据导入和导出。

我们来举个例子

CREATE TABLE my_file_table
(
    id UInt64,
    value Float64
)
ENGINE = File(CSV)
LOCATION '/path/to/file.csv';

6. 其他表引擎

6.1 Join

特点

  • 用于存储临时的关联表,支持左连接和右连接。

使用场景

  • 复杂的关联查询。

我们来举个例子

CREATE TABLE my_join_table
(
    key UInt64,
    value Float64
)
ENGINE = Join(ANY, LEFT, key);

6.2 Buffer

特点

  • 用于缓存数据,定期批量写入目标表。
  • 适用于高并发写入场景。

使用场景

  • 高并发写入和数据流处理。

我们来举个例子

CREATE TABLE my_buffer_table
(
    id UInt64,
    value Float64
)
ENGINE = Buffer(default, my_target_table, 16, 10, 100, 10000, 1000000, 10000000, 100000000);

每种表引擎都有其特定的适用场景和优化目标。选择合适的表引擎可以显著提高 ClickHouse 的性能和可靠性。