ClickHouse 的表存储引擎是其核心特性之一,不同引擎针对不同 OLAP 场景做了极致优化,决定了数据的存储方式、写入 / 查询逻辑、生命周期管理等核心行为。以下按 "核心引擎(MergeTree 系列)、辅助引擎、集成引擎" 三大类,详解主流存储引擎的特性、适用场景及核心配置:
一、 核心引擎:MergeTree 系列(90% 场景首选)
MergeTree 是 ClickHouse 最核心的引擎家族,所有变体均基于 "追加写 + 后台合并 + 按排序键有序存储" 的核心逻辑,适配绝大多数 OLAP 批量写入 + 聚合分析场景。
1. 基础版:MergeTree(核心母引擎)
-
核心特性 :
- 按 "排序键(ORDER BY)" 对数据排序存储,提升范围查询、聚合效率;
- 支持分区(PARTITION BY)、TTL(数据自动过期)、二级索引(跳数索引 / 布隆过滤器);
- 数据写入后生成小 Part,后台异步合并为大 Part,保证查询性能;
- 支持副本(ReplicatedMergeTree)和分布式部署。
-
适用场景:通用 OLAP 场景,如日志存储、用户行为分析、物联网时序数据。
-
创建示例:
CREATE TABLE t_device (
device_id String,
ts DateTime,
temperature Float32,
humidity Float32
) ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(ts) -- 按日期分区
ORDER BY (device_id, ts) -- 排序键:设备ID+时间戳(核心!)
TTL ts + INTERVAL 90 DAY -- 数据保留90天,自动删除
SETTINGS index_granularity = 8192; -- 索引粒度(默认8192行)
2. 去重版:ReplacingMergeTree
-
核心特性 :
- 继承 MergeTree 所有特性,新增 "按排序键去重" 能力;
- 后台合并 Part 时,会删除排序键相同的行,仅保留最后版本 (可通过
VERSIONSION BY指定版本字段,如时间戳); - 注意:去重仅在合并时触发,写入后不会立即去重(需依赖后台 Merge)。
-
适用场景:需要去重的场景,如物联网设备重复上报数据、业务数据全量同步(保留最新值)。
-
创建示例:
CREATE TABLE t_device_unique (
device_id String,
ts DateTime,
temperature Float32
) ENGINE = ReplacingMergeTree(ts) -- 按ts保留最新版本
PARTITION BY toYYYYMMDD(ts)
ORDER BY (device_id, ts); -- 排序键相同则去重
二、 辅助引擎(适配特殊场景)
这类引擎不存储原始数据,或仅做轻量存储,适配临时计算、内存加速、字典映射等场景。
1. Memory(内存引擎)
-
核心特性 :
- 数据完全存储在内存中,查询速度极快,重启后数据丢失;
- 不支持分区、TTL、Merge,仅适合临时数据、测试场景。
-
适用场景:临时计算结果、高频小表(如维度字典)。
-
创建示例:
CREATE TABLE t_temp (id UInt32, name String) ENGINE = Memory();
2. Log 系列(轻量日志引擎)
包括 Log、TinyLog、StripeLog,均为轻量级引擎,无排序、无索引、无合并:
- TinyLog:最简单,单文件存储,适合小表(<100 万行);
- StripeLog:按块存储,支持并发读取,比 TinyLog 高效;
- Log:多文件存储,列独立存储,适合只读、小批量查询场景。
- 适用场景:小体积日志表、临时日志存储(不推荐大规模使用)。
3. Dictionary(字典引擎)
- 核心特性 :
- 适配维度表映射(如设备 ID→设备名称、用户 ID→用户等级);
- 数据加载到内存,查询时快速关联,避免大表 JOIN;
- 支持自动刷新(从 MySQL/ClickHouse 等源同步)。
- 适用场景:维度字典、静态配置表。
三、 集成引擎(对接外部数据源)
这类引擎不存储数据,仅作为 "外部数据源的接口",实现 ClickHouse 与其他系统的无缝集成。
1. Kafka(对接 Kafka 消息队列)
-
核心特性 :
- 直接消费 Kafka 主题数据,支持批量导入到 ClickHouse 表;
- 可配置消费偏移量、格式解析(JSON/CSV/Protobuf);
- 通常配合 MaterializedView 实现 "Kafka → ClickHouse" 实时同步。
-
适用场景:实时数据接入(如日志、物联网设备上报数据)。
-
创建示例:
CREATE TABLE t_kafka_device (
device_id String,
ts DateTime,
temperature Float32
) ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'device_data',
kafka_group_name = 'clickhouse_consumer',
kafka_format = 'JSONEachRow'; -- 消息格式
2. MySQL(对接 MySQL 数据库)
-
核心特性 :
- 直接读取 MySQL 表数据,支持查询、JOIN,无需数据导入;
- 适合作为维度表关联(如 ClickHouse 事实表 JOIN MySQL 维度表)。
-
适用场景:跨库关联查询、维度数据同步。
-
创建示例:
CREATE TABLE t_mysql_device (
device_id String,
device_name String,
vendor String
) ENGINE = MySQL('mysql-host:3306', 'db_name', 'table_name', 'user', 'password');
四、 引擎选型核心原则
| 场景类型 | 首选引擎 | 关键配置 |
|---|---|---|
| 通用 OLAP 批量分析 | MergeTree | 合理设置排序键 / 分区键 |
| 数据去重 | ReplacingMergeTree | 指定 VERSION BY 版本字段 |
| 预聚合统计 | Summing/AggregatingMergeTree | 排序键 = 聚合维度 |
| 高可用部署 | ReplicatedMergeTree | 配置 ZooKeeper 副本 |
| 实时数据接入(Kafka) | Kafka + MaterializedView | 配合 MergeTree 存储结果 |
| 维度表关联 | MySQL/Dictionary | 内存加载维度数据 |
| 临时计算 / 测试 | Memory | 仅内存存储,重启丢失 |
五、 核心注意事项
- 排序键(ORDER BY)是 MergeTree 引擎的核心:需按 "查询高频过滤 / 聚合维度" 设置(如设备 ID + 时间戳),直接影响查询性能;
- 分区键(PARTITION BY)不宜过细:如按小时分区会生成大量小分区,建议按天 / 月分区;
- 副本与分片的区别:副本(Replicated*)是同一份数据的多份拷贝(高可用),分片(Distributed)是数据拆分存储(水平扩展);
- 避免过度使用特殊引擎:如 Log 系列、Memory 引擎仅适合小表,大规模场景优先 MergeTree 系列。
综上,ClickHouse 存储引擎的设计完全围绕 OLAP 场景优化,MergeTree 系列是绝对核心,其他引擎均为补充;选型的关键是匹配 "数据写入模式 + 查询场景 + 数据生命周期",而非盲目追求 "功能全面"。