clickhouse engines

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

posted @ 2025-02-20 13:11  小吉猫  阅读(187)  评论(0)    收藏  举报