database-engines
数据库引擎可以处理的数据表。
默认情况下,ClickHouse使用Atomic数据库引擎。它提供了可配置的table engines和SQL dialect。
Atomic:它支持非阻塞的DROP TABLE和RENAME TABLE查询和原子的EXCHANGE TABLES t1 AND t2查询。默认情况下使用Atomic数据库引擎。
Lazy:在最后一次访问之后,只在RAM中保存expiration_time_in_seconds秒。只能用于*Log表。
MaterializedPostgreSQL: 使用PostgreSQL数据库表的初始数据转储创建ClickHouse数据库,并启动复制过程,即执行后台作业,以便在远程PostgreSQL数据库中的PostgreSQL数据库表上发生新更改时应用这些更改。
MySQL: MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,因此可以执行诸如SHOW TABLES或SHOW CREATE TABLE之类的操作。但无法对其执行以下操作RENAME、CREATE TABLE、ALTER。
PostgreSQL:允许连接到远程PostgreSQL服务。支持读写操作(SELECT和INSERT查询),以在ClickHouse和PostgreSQL之间交换数据。
Replicated:该引擎基于Atomic引擎。它支持通过将DDL日志写入ZooKeeper并在给定数据库的所有副本上执行的元数据复制。
SQLite:允许连接到SQLite数据库,并支持ClickHouse和SQLite交换数据, 执行 INSERT 和 SELECT 查询。
table-engines
MergeTree 系列
MergeTree
ClickHouse 的核心存储引擎,支持高性能分析查询,适用于海量数据场景。
核心特性:
数据分区:通过 PARTITION BY 指定分区键,将数据按分区存储(如按日期)。
排序键:通过 ORDER BY 定义排序键,决定数据在磁盘上的物理顺序。
主键:通过 PRIMARY KEY 定义主键(默认与排序键一致),用于稀疏索引加速查询。
数据压缩:自动对数据进行列式压缩(如 LZ4、ZSTD)。
CREATE TABLE logs (
timestamp DateTime,
user_id UInt32,
event_type String
) ENGINE = MergeTree
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (user_id, timestamp)
SETTINGS index_granularity = 8192; # 这是表的设置部分,指定索引的粒度(index_granularity)为 8192。索引粒度是用于创建稀疏索引的值,它决定了索引中每个连续值的间隔大小。较小的索引粒度可以提供更快的查询性能,但会增加索引占用的存储空间。根据你的查询需求和存储限制,可以选择合适的索引粒度。
ReplicatedMergeTree
在 MergeTree 基础上实现多副本数据同步,保障高可用性。
核心特性:
副本同步:通过 ZooKeeper 协调多个副本节点的数据一致性。
自动故障恢复:主副本宕机时,从副本自动接管。
读写分离:可将读请求分发到副本节点。
CREATE TABLE replicated_logs (
timestamp DateTime,
user_id UInt32,
event_type String
) ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/replicated_logs', -- ZooKeeper 路径
'{replica}' -- 副本标识
)
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (user_id, timestamp);
Data Replication
副本是表级别的,不是整个服务器级的。所以,服务器里可以同时有复制表和非复制表。
常见支持副本引擎:
ReplicatedMergeTree
ReplicatedSummingMergeTree
ReplicatedReplacingMergeTree
ReplicatedAggregatingMergeTree
ReplicatedCollapsingMergeTree
ReplicatedVersionedCollapsingMergeTree
ReplicatedGraphiteMergeTree
Custom Partitioning Key
通过 PARTITION BY 灵活定义分区规则,优化查询性能。
常见策略:
时间分区:PARTITION BY toYYYYMM(date)
哈希分区:PARTITION BY cityHash64(user_id)
枚举分区:PARTITION BY event_type
CREATE TABLE custom_partitioned_table (
user_id UInt32,
event_time DateTime,
data String
) ENGINE = MergeTree
PARTITION BY (toYYYYMM(event_time), user_id % 10) -- 按年月 + 用户ID取模分区
ORDER BY (user_id, event_time);
ReplacingMergeTree
自动去重合并数据,保留最新版本。
核心特性:
去重逻辑:根据 ORDER BY 键自动合并重复数据,保留最后插入的记录。
手动触发合并:需显式执行 OPTIMIZE TABLE 触发合并操作。
CREATE TABLE user_actions (
user_id UInt32,
action_time DateTime,
action_type String
) ENGINE = ReplacingMergeTree(action_time)
PARTITION BY toYYYYMM(action_time)
ORDER BY (user_id, action_time);
SummingMergeTree
预聚合数值列,加速 SUM 查询。
核心特性:
自动聚合:合并数据时对数值列(如 Int、Float)自动求和。
非数值列处理:保留非数值列的任意值(通常无意义)。
CREATE TABLE sales (
product_id UInt32,
date Date,
revenue Float64,
quantity UInt32
) ENGINE = SummingMergeTree()
PARTITION BY date
ORDER BY (product_id, date)
SETTINGS summing_columns = 'revenue, quantity'; -- 指定聚合列
AggregatingMergeTree
支持自定义聚合逻辑(如计算 UV、PV)。
核心特性:
预聚合:配合 AggregateFunction 类型(如 uniqState、sumState)存储中间状态。
查询加速:通过 *Merge 函数读取聚合结果。
CREATE TABLE user_visits (
date Date,
user_id AggregateFunction(uniq, UInt32) -- 存储唯一用户ID的中间状态
) ENGINE = AggregatingMergeTree()
PARTITION BY date
ORDER BY date;
-- 插入数据时使用 `uniqState` 函数
INSERT INTO user_visits SELECT
today() AS date,
uniqState(user_id)
FROM raw_logs
GROUP BY date;
CollapsingMergeTree
通过标记列(Sign)折叠旧数据,优化存储。
核心特性:
数据折叠:通过 Sign 列(1 表示新增,-1 表示删除)标记数据版本。
合并规则:合并时,Sign=1 和 Sign=-1 的相同键数据会被抵消删除。
CREATE TABLE collapsing_table (
user_id UInt32,
name String,
sign Int8
) ENGINE = CollapsingMergeTree(sign)
ORDER BY user_id;
-- 插入新增记录
INSERT INTO collapsing_table VALUES (1, 'Alice', 1);
-- 插入删除记录
INSERT INTO collapsing_table VALUES (1, 'Alice', -1);
VersionedCollapsingMergeTree
在 CollapsingMergeTree 基础上支持多版本数据折叠。
核心特性:
版本控制:通过 Version 列标记数据版本,解决乱序写入问题。
合并规则:仅合并相同 Version 的数据。
CREATE TABLE versioned_collapsing_table (
user_id UInt32,
name String,
sign Int8,
version UInt32
) ENGINE = VersionedCollapsingMergeTree(sign, version)
ORDER BY user_id;
GraphiteMergeTree
专为时序数据(如 Graphite 监控指标)优化。
核心特性:
自动聚合规则:按预定义的 config.xml 规则聚合时序数据。
存储优化:支持降采样(Rollup)和保留策略。
<graphite_rollup>
<pattern>
<regexp>^clickhouse\.metric\.</regexp>
<function>any</function>
<retention>
<age>86400</age>
<precision>60</precision>
</retention>
</pattern>
</graphite_rollup>
Vector Similarity Indexes
支持向量数据的高效相似度搜索(实验性功能)。
核心特性
向量索引:通过 ANN(Approximate Nearest Neighbor)索引加速向量检索。
距离函数:支持余弦相似度、欧氏距离等。
CREATE TABLE vector_table (
id UInt32,
vector Array(Float32),
INDEX ann_index vector TYPE annoy(100) -- 100 表示树的数量
) ENGINE = MergeTree
ORDER BY id;
Full-text Indexes
支持文本内容的快速检索。
核心特性:
倒排索引:通过 ngrambf 或 tokenbf 索引加速文本匹配。
分词配置:支持自定义分词规则。
CREATE TABLE fulltext_table (
id UInt32,
content String,
INDEX content_index content TYPE ngrambf_v1(3, 512, 2, 0) -- 3-gram 布隆过滤器
) ENGINE = MergeTree
ORDER BY id;
总结
| 引擎/功能 |
核心用途 |
适用场景 |
| MergeTree |
基础分析存储 |
海量数据 OLAP |
| ReplicatedMergeTree |
高可用多副本 |
容灾、读写分离 |
| SummingMergeTree |
预聚合数值列 |
快速统计 SUM、COUNT |
| AggregatingMergeTree |
自定义聚合逻辑 |
UV、PV 计算 |
| CollapsingMergeTree |
数据版本折叠 |
频繁更新的时序数据 |
| GraphiteMergeTree |
时序数据优化 |
监控指标存储 |
| 向量索引 |
相似度搜索 |
推荐系统、图像检索 |
| 全文索引 |
文本快速检索 |
日志分析、内容搜索 |
log engine 系列
Log
作用:基础日志引擎,支持并发读写,数据按列存储。
核心特性:
存储结构:每个列单独存储为 .bin 文件,同时生成标记文件(.mrk)记录数据块偏移。
并发性:支持多线程读写,但写入时对每个列文件加锁,高并发写入可能成为瓶颈。
查询性能:适合全表扫描,但无索引支持,范围查询效率低。
适用场景:小规模数据(如临时表、配置表),需频繁读写但数据量不大。
CREATE TABLE log_table (
id UInt32,
data String
) ENGINE = Log;
StripeLog
作用:改进版日志引擎,优化数据块存储,减少文件数量。
核心特性:
存储结构:数据以“块”形式存储(所有列合并为单一数据块),减少小文件数量。
并发性:支持并发读写,写入性能优于 Log(减少锁竞争)。
查询性能:全表扫描效率与 Log 类似,但插入吞吐量更高。
适用场景:中小规模数据,需要更高写入吞吐量的场景。
CREATE TABLE stripe_log_table (
id UInt32,
data String
) ENGINE = StripeLog;
TinyLog
作用:极简日志引擎,写入性能最差,但结构最简单。
核心特性:
存储结构:所有列合并为单一文件(无标记文件),写入时追加数据。
并发性:仅支持读并发,写入时表被锁定(不可读)。
查询性能:适合极小数据量的全表扫描。
适用场景:极小的静态表(如配置表、测试环境)。
CREATE TABLE tiny_log_table (
id UInt32,
data String
) ENGINE = TinyLog;
总结
| 特性 |
Log |
StripeLog |
TinyLog |
| 存储结构 |
列独立文件 + 标记文件 |
数据块合并存储 |
所有列合并为单一文件 |
| 写入并发 |
支持(列级锁) |
支持(块级锁) |
不支持(全表锁) |
| 读取并发 |
支持 |
支持 |
支持 |
| 写入性能 |
中等 |
较高 |
低 |
| 文件数量 |
多(每列独立文件) |
少(块存储) |
最少(单一文件) |
| 适用数据量 |
小规模(GB 级以下) |
中小规模(GB 级以下) |
极小规模(MB 级) |
| 典型场景 |
频繁读写的小表 |
高写入吞吐的小表 |
只读或极低频写入的配置表 |
集成系列
Azure Blob Storage
用途:直接读写 Azure Blob Storage 中的文件(如 Parquet、CSV、JSON)。
场景:直接查询 Azure 存储中的冷数据,无需导入 ClickHouse。
限制:只读,不支持写入。
CREATE TABLE azure_table (
id UInt32,
data String
) ENGINE = AzureBlobStorage(
'https://account.blob.core.windows.net/container/path',
'storage_account_name',
'storage_account_key',
'CSV'
);
DeltaLake
用途:通过 Hive Metastore 集成查询 Delta Lake 格式的数据。
依赖:需配置 Hive Metastore。
场景:与 Delta Lake 数据湖集成,支持 ACID 事务。
限制:需依赖 Hive Metastore,功能处于实验阶段。
CREATE TABLE delta_table
ENGINE = DeltaLake('hive_metastore_uri', 'delta_table_name');
EmbeddedRocksDB
用途:基于 RocksDB 的键值存储,支持高性能点查。
场景:频繁的键值查询(如用户画像元数据)。
限制:实验性功能,不支持复杂查询。
CREATE TABLE rocks_table (
key String,
value String
) ENGINE = EmbeddedRocksDB
PRIMARY KEY key;
ExternalDistributed
用途:将外部系统(如 MySQL、PostgreSQL)的表映射为分布式表。
场景:跨异构数据库的联合查询。
限制:性能依赖外部系统,可能较慢。
CREATE TABLE ext_distributed
ENGINE = ExternalDistributed('MySQL', 'mysql-host:3306', 'database', 'table');
TimeSeries
用途:专为时序数据优化的存储(如指标、日志)。
场景:高频写入的时序数据分析(如 IoT 设备监控)。
限制:实验性功能,社区版支持有限。
CREATE TABLE metrics (
timestamp DateTime,
metric_name String,
value Float64
) ENGINE = TimeSeries
ORDER BY (metric_name, timestamp);
HDFS
用途:直接读写 HDFS 上的文件(Parquet、ORC、CSV)。
场景:与 Hadoop 生态集成,直接查询 HDFS 数据。
限制:只读。
CREATE TABLE hdfs_table (
id UInt32,
data String
) ENGINE = HDFS('hdfs://path/to/file.csv', 'CSV');
Hive
用途:通过 Hive Metastore 查询 Hive 表数据。
场景:与 Hive 数据仓库集成。
限制:需 Hive Metastore 服务,性能依赖 HDFS。
CREATE TABLE hive_table
ENGINE = Hive('hive_metastore_uri', 'hive_database', 'hive_table');
Hudi
用途:查询 Apache Hudi 格式的数据(需 Hive Metastore)。
场景:实时数据湖场景,支持增量更新。
限制:实验性功能,需 Hive 集成。
CREATE TABLE hudi_table
ENGINE = Hudi('hive_metastore_uri', 'hudi_table_name');
lceberg
用途:查询 Apache Iceberg 格式的数据。
场景:与 Iceberg 表格式集成,支持快照查询。
限制:需配置 Iceberg Catalog,功能处于早期阶段。
CREATE TABLE iceberg_table
ENGINE = Iceberg('iceberg_catalog_name', 'database', 'table');
JDBC
用途:通过 JDBC 驱动连接外部数据库(如 Oracle、SQL Server)。
场景:跨数据库联合查询。
限制:性能较低,适合低频小数据量查询。
CREATE TABLE jdbc_table
ENGINE = JDBC(
'jdbc:oracle:thin:@host:1521:db',
'username',
'password',
'schema.table'
);
Kafka
用途:从 Kafka 消费数据或写入数据到 Kafka。
场景:实时数据流处理(如日志、事件流)。
限制:需配合物化视图实现持久化存储。
CREATE TABLE kafka_table (
message String
) ENGINE = Kafka(
'kafka-broker:9092',
'topic_name',
'consumer_group',
'JSONEachRow'
);
MaterializedPostgreSQL
用途:将 PostgreSQL 表同步到 ClickHouse,支持双向同步。
场景:与 PostgreSQL 实时数据同步。
限制:需 PostgreSQL 逻辑复制权限。
CREATE TABLE pg_sync_table
ENGINE = MaterializedPostgreSQL(
'postgres-host:5432',
'database',
'table',
'user',
'password'
);
MongoDB
用途:查询 MongoDB 集合数据。
场景:与 MongoDB 文档数据库集成。
限制:复杂查询性能较低。
CREATE TABLE mongo_table
ENGINE = MongoDB(
'mongodb-host:27017',
'database',
'collection',
'user',
'password'
);
MySQL
用途:查询 MySQL 表数据。
场景:与 MySQL 数据库联合查询。
限制:只读,不支持写入。
CREATE TABLE mysql_table
ENGINE = MySQL(
'mysql-host:3306',
'database',
'table',
'user',
'password'
);
NATS
用途:从 NATS 消息队列消费数据。
场景:实时消息处理。
限制:实验性功能,社区支持有限。
CREATE TABLE nats_table (
message String
) ENGINE = NATS(
'nats-host:4222',
'subject',
'JSONEachRow'
);
ODBC
用途:通过 ODBC 驱动连接外部数据库。
场景:连接不支持 JDBC 的旧数据库(如 Access)。
限制:配置复杂,性能较低。
CREATE TABLE odbc_table
ENGINE = ODBC(
'DSN=odbc_dsn_name',
'schema.table'
);
PostgreSQL
用途:查询 PostgreSQL 表数据。
场景:与 PostgreSQL 数据库集成。
限制:只读,复杂查询性能受限。
CREATE TABLE pg_table
ENGINE = PostgreSQL(
'postgres-host:5432',
'database',
'table',
'user',
'password'
);
RabbitMQ
用途:从 RabbitMQ 消费或发布消息。
场景:消息队列集成(如任务队列处理)。
限制:实验性功能,需手动确认消息。
CREATE TABLE rabbitmq_table (
message String
) ENGINE = RabbitMQ(
'amqp://user:password@host:5672',
'exchange',
'routing_key',
'queue',
'JSONEachRow'
);
Redis
用途:读写 Redis 键值数据。
场景:缓存数据查询或更新。
限制:仅支持简单键值操作。
CREATE TABLE redis_table (
key String,
value String
) ENGINE = Redis(
'redis-host:6379',
'db_index',
'password'
);
S3
用途:直接读写 Amazon S3 或其他兼容 S3 协议的对象存储。
场景:分析存储在 S3 上的大规模数据集。
限制:只读,需处理文件格式兼容性。
CREATE TABLE s3_table (
id UInt32,
data String
) ENGINE = S3(
'https://bucket.s3.amazonaws.com/path/file.csv',
'AWS_ACCESS_KEY_ID',
'AWS_SECRET_ACCESS_KEY',
'CSV'
);
SQLite
用途:查询 SQLite 数据库文件。
场景:本地小型数据库集成。
限制:只读,性能受限于 SQLite 文件
CREATE TABLE sqlite_table
ENGINE = SQLite(
'/path/to/file.db',
'table'
);
special
Distributed
作用:分布式表引擎,本身不存储数据,用于跨分片(Shard)查询或写入。
核心特性:
透明分片查询:将查询分发到多个节点,合并结果。
写入路由:支持将数据写入本地表或随机分片。
适用场景:分布式集群中的数据查询与写入。
CREATE TABLE distributed_table
ENGINE = Distributed(cluster_name, database, local_table, sharding_key);
Dictionary
作用:字典引擎,管理预加载的键值对数据(如配置、维度表)。
核心特性:
高效查询:内存中存储,支持快速键值查找。
多种数据源:可从文件、HTTP、MySQL 等加载。
适用场景:关联查询(如将 ID 映射为名称)。
CREATE DICTIONARY user_names (
id UInt64,
name String
) PRIMARY KEY id
SOURCE(FILE(PATH '/data/user_names.csv'))
LIFETIME(300);
Merge
作用:合并表引擎,虚拟合并多个表的数据(类似 UNION ALL)。
核心特性:
逻辑视图:不存储数据,动态合并查询。
要求:所有表结构必须相同。
适用场景:查询多个相同结构表的联合数据。
CREATE TABLE merged_logs
ENGINE = Merge(database, '^logs_');
Executable
作用:外部脚本引擎,通过执行外部脚本(如 Python、Bash)生成数据。
核心特性:
动态数据生成:每次查询调用脚本。
灵活性:适用于复杂数据处理逻辑。
适用场景:实时生成数据或对接外部系统。
CREATE TABLE exec_table
ENGINE = Executable('/scripts/generate_data.py', 'TabSeparated');
File
作用:文件引擎,直接读取或写入本地文件(如 CSV、JSON)。
核心特性:
无存储:数据直接映射到文件。
只读/可写:取决于文件格式。
适用场景:快速导入/导出数据。
CREATE TABLE file_table
ENGINE = File(CSV, '/data/file.csv');
NuIl
作用:空引擎,写入数据后立即丢弃,仅用于测试或占位。
适用场景:
测试数据管道。
作为物化视图的终点(不存储数据)。
CREATE TABLE null_table ENGINE = Null;
Set
作用:集合引擎,存储内存中的数据集,用于 IN 子查询优化。
核心特性:
高效过滤:预加载数据到内存。
数据易失性:重启后丢失。
适用场景:频繁过滤的小数据集。
CREATE TABLE active_users
ENGINE = Set
AS SELECT id FROM users WHERE is_active = 1;
Join
作用:关联引擎,存储右表数据以加速 JOIN 操作。
核心特性:
内存存储:数据常驻内存。
仅支持右关联:用于 JOIN 操作的右表。
适用场景:频繁关联的小表(如维度表)。
CREATE TABLE dim_city
ENGINE = Join(ANY, LEFT, city_id)
AS SELECT city_id, city_name FROM cities;
URL
作用:HTTP 引擎,通过 HTTP/HTTPS 读取或写入远程文件。
适用场景:直接读取互联网上的公共数据集。
CREATE TABLE url_table
ENGINE = URL('https://example.com/data.csv', CSV);
View
作用:视图引擎,保存查询逻辑(不存储数据)。
类型:
普通视图:CREATE VIEW,仅保存查询语句。
物化视图:CREATE MATERIALIZED VIEW,自动存储计算结果。
适用场景:简化复杂查询或预计算指标。
CREATE VIEW daily_sales AS
SELECT toDate(order_time) AS day, sum(amount) FROM orders GROUP BY day;
Memory
作用:内存引擎,数据完全存储在内存中。
核心特性:
高速读写:无磁盘操作。
易失性:服务重启后数据丢失。
适用场景:临时数据或测试。
CREATE TABLE temp_data ENGINE = Memory;
Buffer
作用:缓冲引擎,将数据暂存内存,定期刷入目标表。
核心特性:
减少写入频率:合并多次写入。
数据可靠性:宕机可能丢失缓冲中的数据。
适用场景:高频小批量写入优化。
CREATE TABLE buffer_logs
ENGINE = Buffer(database, target_table, 16, 10, 100, 10000);
External Data
作用:外部数据查询,临时加载外部文件到查询上下文。
适用场景:在查询中直接使用本地文件,无需建表。
SELECT * FROM file('data.csv', CSV, 'id Int, name String');
GenerateRandom
作用:随机数据生成引擎,按指定模式生成测试数据。
适用场景:性能测试或功能验证。
CREATE TABLE random_data
ENGINE = GenerateRandom(seed=42)
AS SELECT rand() AS id, randomString(10) AS name;
KeeperMap
作用:基于 ZooKeeper 的键值存储引擎(实验性功能),用于分布式配置管理。
适用场景:跨节点共享配置或状态。
CREATE TABLE keeper_config
ENGINE = KeeperMap('path_in_zookeeper')
(key String, value String);
FileLog
作用:日志文件引擎,从文件(如 Kafka 日志)持续读取数据流。
适用场景:实时消费日志文件(需配合 SELECT ... STREAM 查询)。
CREATE TABLE log_stream
ENGINE = FileLog('/var/log/app.log')
SETTINGS format = 'JSONEachRow';
总结
| 引擎/功能 |
核心功能 |
适用场景 |
Distributed |
跨分片查询与写入 |
分布式集群 |
Dictionary |
键值对内存存储 |
维度表关联 |
Memory |
内存临时数据 |
高速读写、测试 |
Buffer |
缓冲写入目标表 |
高频小批量写入优化 |
Join |
内存存储右表数据 |
加速 JOIN 查询 |
FileLog |
实时读取日志文件 |
流式数据处理 |
参考文档
https://clickhouse.com/docs/en/engines/table-engines