首页/数据/NoSQL 速查/表引擎分类与选择
ClickHouse56 条

表引擎分类与选择

ClickHouse 表引擎决定数据存储与读写方式:生产数据以 MergeTree 家族为主,集成引擎对接外部系统,Distributed 负责集群读写转发,Log 家族只适合小数据。

NoSQL 速查数据更新于 2026-10-13

表引擎决定什么

ClickHouse 的表引擎决定数据怎么存、怎么读、能不能合并:生产数据以 MergeTree 家族为主,它们带主键排序、分区与后台合并;集成引擎(Kafka、MySQL、S3 等)把外部数据源映射成表;Distributed 负责集群层面的读写转发;Log 家族结构简单、没有索引,只适合小表与临时数据。

基本信息

MergeTree 家族Replacing / Summing / Aggregating / Collapsing / Replicated 等,带排序键与后台合并
Log 家族TinyLog / Log / StripeLog,无索引,适合小数据量
集成引擎Kafka / MySQL / PostgreSQL / JDBC / S3 / URL 等,对接外部数据源
特殊引擎Distributed、Dictionary、Merge、Buffer、Null、Memory、File
查看方式SELECT name, description FROM system.table_engines

典型使用场景

  • 选型时先确认是否需要主键排序、分区与合并去重
  • 外部数据同步:Kafka 引擎表加物化视图,把数据落到 MergeTree
  • 集群查询入口:用 Distributed 表把查询分发到各分片
  • 临时数据与小字典表:Memory、Log 家族建表快、开销低
  • 一次性分析外部文件:File、URL 引擎直接把文件当表查

常用操作

常用操作
-- 列出实例支持的全部引擎与说明
SELECT name, description FROM system.table_engines ORDER BY name;

-- 生产日志表:MergeTree 家族,带分区与排序键
CREATE TABLE events
(
    ts      DateTime,
    user_id UInt64,
    action  LowCardinality(String)
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(ts)
ORDER BY (ts, user_id);

-- 临时小表:Log 家族,无索引、写入轻
CREATE TABLE tmp_log (ts DateTime, msg String) ENGINE = Log;

-- 查看某张表实际使用的引擎与建表语句
SHOW CREATE TABLE events;

引擎族与适用边界

引擎族特点适用 / 不建议
MergeTree有排序键、分区与后台合并绝大多数生产表;不适合单行高频更新
Log 家族无索引、结构简单小表与临时数据;大表不要用
Distributed只做转发,不存数据集群查询入口;单机部署不需要
Memory数据驻留内存,重启即失临时中间结果;不能存业务数据
集成引擎把外部数据源映射成表做同步与查询;多数不宜当业务主表
Memory 引擎数据不落盘、重启即丢,只适合临时表;File、URL 引擎把外部文件或 HTTP 响应当表查询,适合一次性分析,不宜纳入常规数据链路。

易错点

  • 把大业务表建在 Log 家族上会缺少索引与合并优化,查询只能全表扫描,后续迁移成本很高
  • 集成引擎表多数不具备合并语义,Kafka 引擎表的行被读走一次就消费掉,排查时先确认引擎参数与消费位点
  • Distributed 表本身不存数据,对它的删表或改结构不会作用到本地表,容易误判数据被删除
  • 单机部署照抄集群方案建 Distributed 表,只会多出一层转发开销而没有任何收益

数据来源与参考

  • ClickHouse Docs: Table engines
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌