前置:/clickhouse-table-engines/(表引擎体系)、/clickhouse-dictionaries-joins/(字典机制)、/clickhouse-data-ingestion/(数据导入与格式)、/clickhouse-materialized-views/(物化视图)。
目录
- 1. 联邦查询的定位:外部数据源访问方式
- 2. MySQL 表引擎:实时读业务库
- 3. PostgreSQL 表引擎:外部 JDBC 连接
- 4. URL 表引擎:HTTP 接口即表
- 5. File 与 S3 表引擎:文件即表
- 6. 字典外部源:以 Dictionary 方式关联
- 7. 联邦查询性能特征与注意
- 8. 数据同步替代方案:物化视图与拉取
- 9. 外部数据源选型对比
- 10. 速查表与一句话记忆
- 延伸阅读
1. 联邦查询的定位:外部数据源访问方式
联邦查询(Federated Query)让 ClickHouse 直接读取外部系统的数据,而不用先 ETL 导入——适合临时探查、维表关联、跨系统分析。
外部数据源访问方式:
□ 表引擎:MySQL / PostgreSQL / URL / File / S3
□ 表函数:mysql(...) / url(...) / s3(...) / file(...)
□ 字典外部源:外部数据加载为内存字典
适用:读业务库→MySQL/PG;API/文件→URL/File/S3;高频维表→字典
注意:联邦查询不替代数据仓库,大规模分析仍要物化
-- 表函数式即时查询(无需建表)
SELECT * FROM mysql(
'127.0.0.1:3306', 'app_db', 'orders',
'reader', 'password'
) LIMIT 10;
-- 查询远程 PostgreSQL
SELECT * FROM postgresql(
'127.0.0.1:5432', 'app_db', 'customers',
'reader', 'password'
) LIMIT 10;
工程要点:联邦查询用表引擎 / 表函数 / 字典三种方式直连外部系统,适合临时探查与关联;它的定位是分析链路的补充而非替代,大规模数据仍要物化到本地 MergeTree 才能发挥列式优势。
2. MySQL 表引擎:实时读业务库
MySQL 表引擎让 ClickHouse 把一张 MySQL 表当本地表读,INSERT/SELECT 都能透传,甚至支持写回。
MySQL 引擎要点:
□ 建表声明 MySQL 连接信息,列与远端对齐
□ 查询透传到 MySQL,结果回传
□ 支持 SELECT / INSERT(写入远端)
□ WHERE 尽量下推,减少回传
类型映射:INT→Int32、VARCHAR→String、DECIMAL→Decimal、DATETIME→DateTime
限制:无列式/索引能力,连接压力高,大扫描会打垮业务库
-- 建 MySQL 引擎表
CREATE TABLE mysql_orders (
id UInt64, user_id UInt64,
amount Decimal(18, 2), created_at DateTime
) ENGINE = MySQL(
'127.0.0.1:3306', 'app_db', 'orders',
'reader', 'password'
);
-- 直接查询:等价于查远端表
SELECT user_id, sum(amount) AS total
FROM mysql_orders
WHERE created_at >= now() - INTERVAL 1 DAY
GROUP BY user_id;
工程要点:MySQL 引擎把业务库表「虚拟成 ClickHouse 表」,查询透传、可读写,适合小数据量实时关联;但它没有列式与索引优势、连接成本高,必须把 WHERE 下推、避免大范围扫描,否则会拖垮业务库。
3. PostgreSQL 表引擎:外部 JDBC 连接
PostgreSQL 表引擎与 MySQL 引擎类似,通过外部连接读 PG 表,适合 PG 业务系统的关联分析。
PostgreSQL 引擎要点:
□ 建表声明 PG 连接,列类型按 PG 映射
□ 支持 SELECT / INSERT,依赖连接复用
类型映射:serial→UInt64、numeric→Decimal、text→String、json→String
注意:大结果回传慢、PG max_connections 有限
-- 建 PostgreSQL 引擎表
CREATE TABLE pg_customers (
id UInt64, name String,
region String, vip_level Int32
) ENGINE = PostgreSQL(
'127.0.0.1:5432', 'app_db', 'customers',
'reader', 'password'
);
-- 联邦关联:本地事件 × PG 维表
SELECT e.event_time, c.region, c.vip_level
FROM events AS e
LEFT JOIN pg_customers AS c ON e.customer_id = c.id
WHERE c.region = '华东';
工程要点:PostgreSQL 引擎按 PG 连接串建虚拟表,与 MySQL 引擎同属「实时直连关系库」模式——适合维表关联与探查,但要注意类型映射、连接上限与结果回传,任何大查询都要先过滤再回传。
4. URL 表引擎:HTTP 接口即表
URL 表引擎(及 url() 表函数)把任意 HTTP(S) 接口变成可查询的「表」——返回 JSON/CSV 的 API 都能直接分析。
URL 引擎要点:
□ 每次查询发起 HTTP 请求读取远端
□ 支持 GET 请求:GET 参数即查询条件
□ 响应格式:CSV / JSONEachRow / Parquet 等
□ url 表函数临时查询,URL 引擎建表复用
使用场景:第三方 API、内部服务接口、一次性对账
性能特征:
□ 网络延迟主导,不适合高频大查询
□ 接口返回量决定速度
□ 大响应分批读取,别全量拉取
-- 表函数:一次 HTTP GET
SELECT * FROM url(
'http://api.example.com/metrics?date=2026-09-30',
'JSONEachRow',
'ts DateTime, metric String, value Float64'
) LIMIT 100;
-- 建 URL 引擎表(可复用)
CREATE TABLE api_metrics (
ts DateTime, metric String, value Float64
) ENGINE = URL(
'http://api.example.com/metrics',
'JSONEachRow'
);
工程要点:URL 表引擎把 HTTP 接口「表化」,一次查询 = 一次 HTTP 请求,适合小数据量的外部 API 分析;它的性能完全由网络与接口返回量决定,大响应必须分批、高频查询必须缓存或物化,否则就是给外部服务持续施压。
5. File 与 S3 表引擎:文件即表
File、S3 表引擎/表函数把本地文件与对象存储当表查,是数据湖风格分析的入口。
File 引擎:读本地文件(CSV/Parquet),表函数 file('path','format',...)
S3 引擎:读 S3/OSS/MinIO,支持通配符批量文件(*.parquet)
架构意义:数据湖文件 → 直接 SQL 查询(不搬家)
注意:Parquet 自带列裁剪,配合效果好
-- file 表函数:读本地 CSV
SELECT * FROM file(
'/tmp/events.csv',
'CSV',
'event_time DateTime, user_id UInt64, event_type String'
) LIMIT 10;
-- s3 表函数:读对象存储的 Parquet
SELECT * FROM s3(
'https://bucket.s3.region.amazonaws.com/logs/2026-09/*.parquet',
'Parquet'
) LIMIT 10;
工程要点:File/S3 引擎把「文件即表」落地——本地文件与对象存储直接用 SQL 分析,Parquet 的列式裁剪还能进一步减负;这类引擎适合做数据湖原始层,配合物化视图把常用子集沉淀进 MergeTree。
6. 字典外部源:以 Dictionary 方式关联
字典不仅可以加载本地表,还能直接挂外部数据源(MySQL/PG/HTTP/ClickHouse),把外部维表常驻内存供 dictGet 探测。
字典外部源:CLICKHOUSE / MYSQL / POSTGRESQL / HTTP
□ 加载后 LIFETIME 定期刷新
为什么用字典:一次加载多次探测 → 比 JOIN 快
□ 各节点本地副本 → 分布式可见
注意:内存由数据量决定、刷新窗口内数据可能滞后
-- 从 MySQL 加载维表字典
CREATE DICTIONARY dict_customers (
customer_id UInt64, name String, region String
)
PRIMARY KEY customer_id
SOURCE(MYSQL(
host '127.0.0.1' port 3306
user 'reader' password 'password'
db 'app_db' table 'customers'
))
LIFETIME(MIN 300 MAX 600);
-- 查询时 dictGet 点查:不经过 JOIN
SELECT event_time, customer_id,
dictGet('dict_customers', 'region', customer_id) AS region
FROM events;
工程要点:字典外部源把外部维表一次加载进内存并按 LIFETIME 刷新,配合 dictGet 实现「无 JOIN 的关联」——比实时连接关系库快得多,也天然解决分布式可见性;代价是内存占用与刷新滞后,适合相对静态、规模可控的维表。
7. 联邦查询性能特征与注意
外部数据源查询的性能边界与本地 MergeTree 完全不同,这里列出共性的性能特征与规避事项。
性能共性:
□ 外部系统每次查询都有网络往返
□ 行式数据库/API 无法利用列裁剪
□ 大结果回传拖慢查询
□ 高并发 → 打满外部连接池
注意清单:
□ WHERE 下推到外部(能过滤就过滤)
□ 只 SELECT 需要的列(少回传)
□ 避免 JOIN 外部大表(字典替代)
□ 外部连接数有限 → 复用而非突增
-- 下推示例:条件在 MySQL 侧过滤,回传少
SELECT user_id, sum(amount)
FROM mysql_orders
WHERE created_at >= '2026-09-01' -- 下推到远端
AND amount > 100 -- 下推到远端
GROUP BY user_id LIMIT 100;
-- 观察联邦查询耗时与读取量
SELECT query, query_duration_ms, read_rows
FROM system.query_log
WHERE query ILIKE '%mysql%' OR query ILIKE '%url%' OR query ILIKE '%s3%'
ORDER BY query_duration_ms DESC LIMIT 20;
工程要点:联邦查询的性能由外部系统的网络与行式处理能力决定,必须主动WHERE 下推、少列回传、LIMIT 兜底;外部连接是共享稀缺资源,高并发场景务必复用连接并控制并发度,否则联邦查询会成为 ClickHouse 集群的拖后腿点。
8. 数据同步替代方案:物化视图与拉取
当外部数据需要「持续可分析」时,与其每次联邦查询,不如定期物化到本地——用物化视图或定时任务把外部数据拉到 MergeTree。
同步替代方案:
□ 物化视图:基于外部引擎表持续查询,增量转存
□ 定时拉取:周期性从外部源抽取到本地
□ 外部表作为「暂存层」:先入本地再加工
优点:查询走本地列式、不频繁打外部、有 TTL/分区/索引
注意:物化视图只跟增量、定时拉取要处理去重幂等
-- 物化视图:MySQL 增量转存到本地 MergeTree
CREATE MATERIALIZED VIEW mv_orders TO orders_local AS
SELECT id, user_id, amount, created_at FROM mysql_orders;
-- 定时拉取(替代方案):周期性执行
INSERT INTO orders_local
SELECT id, user_id, amount, created_at FROM mysql_orders
WHERE created_at > (SELECT max(created_at) FROM orders_local);
-- 本地分析不再触碰外部系统
SELECT toDate(created_at) AS d, sum(amount)
FROM orders_local GROUP BY d ORDER BY d;
工程要点:数据同步的替代方案是**「物化优先」——用物化视图承接增量、定时任务做全量/增量拉取,把外部数据落地 MergeTree 后再分析;联邦查询保留给低频探查与临时关联**,长期可分析的数据必须本地化。
9. 外部数据源选型对比
六类外部访问方式各有所长,按「数据量 × 频率 × 数据形态」选型。
选型对比:
□ MySQL/PG 引擎:关系库实时读,小维表/探查
□ URL 引擎:API 即表,小数据、低频
□ File/S3 引擎:文件/对象存储,批式
□ 字典外部源:静态维表高频探测
□ 物化+拉取:持续分析的正确形态
选型决策:
□ 高频关联维表 → 字典
□ 低频探查关系库 → MySQL/PG 引擎
□ 批式文件分析 → S3/File
□ 需要持续分析 → 物化到本地
一句决策:能物化的别联邦,能字典的别 JOIN,能过滤的下推
-- 同一需求的不同实现:关联维表
-- 方案 A:MySQL 引擎 JOIN(低频)
SELECT ... FROM events e LEFT JOIN mysql_customers c ON ...;
-- 方案 B:字典(高频)
SELECT ..., dictGet('dict_customers', 'region', e.customer_id) FROM events e;
-- 方案 C:物化本地维表(持续)
CREATE TABLE dim_customers_local AS SELECT * FROM mysql_customers;
工程要点:外部数据源选型的口诀是**「能物化的别联邦、能字典的别 JOIN、能过滤的下推」**——静态维表用字典、低频探查用直连引擎、批式分析用文件引擎、持续分析必须物化;把联邦查询压缩到最小使用面,才能保证集群性能稳定。
10. 速查表与一句话记忆
压成速查表,写代码前先对照。
联邦查询速查:
□ MySQL / PG → 关系库实时读(低频)
□ URL → HTTP 接口即表(小数据)
□ File / S3 → 文件与对象存储(批式)
□ 字典外部源 → 静态维表高频探测
□ 物化 + 拉取 → 持续分析的最终形态
注意:WHERE 下推、少列回传、连接复用、数据量大 → 物化
一句记忆:外部数据先物化、再分析
-- 联邦查询体检模板
SELECT query, query_duration_ms, read_rows
FROM system.query_log
WHERE query ILIKE '%_mysql%' OR query ILIKE '%url%' OR query ILIKE '%s3%'
ORDER BY query_duration_ms DESC LIMIT 20;
-- 检查字典加载状态
SELECT name, status, type, bytes_allocated FROM system.dictionaries;
工程要点:联邦查询的终极原则是**「外部数据先物化、再分析」——直连引擎、表函数、字典都是探查与关联的补充手段**,持续可分析的数据必须用物化视图与定时拉取沉淀到 MergeTree,联邦查询永远只负责「低频、小量、临时」。
延伸阅读
- /clickhouse-table-engines/ — 表引擎体系与引擎选型
- /clickhouse-dictionaries-joins/ — 字典机制与外部源加载
- /clickhouse-data-ingestion/ — 数据导入格式与装载方式
- /clickhouse-materialized-views/ — 物化视图与数据加工管道
- /clickhouse-kafka-engine/ — Kafka 引擎:另一种实时外部数据源
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。