ClickHouse 的 SQL 接近标准 SQL,会写 SQL 的人单表查询上手快,这点不绕。但"好学"在迁移评估里是最容易误导人的指标------很多团队上线后才发现,真正烧钱的是换引擎之后 MySQL 客户端、JDBC、BI 报表、权限审计、慢查询监控那一整套要不要重建。这篇不争论"哪个更学得会",而是给你一套从 MySQL 迁到 Apache Doris 的可执行验证步骤,每一步都带命令和核对清单,跑完你就能直接算出适配成本。结论先放这:如果你的存量系统深度依赖 MySQL 协议生态,Doris 的 MySQL 协议 100% 兼容能让客户端、驱动、BI、权限基本零改造复用,省下的不是学费,是工具链重建费。
一、先说结论
- 语法层:ClickHouse SQL 约 95% 标准 SQL,单表聚合上手快;但 GROUP BY 强制、DateTime 类型、COUNT 语义、JOIN 设计、异步更新这些方言差异,会让存量 SQL 做适配。
- 协议层:Apache Doris 完全兼容 MySQL 协议、支持标准 SQL,现有 MySQL 客户端、JDBC、ORM、BI 几乎零改造就能连,information_schema 高度兼容。
- 验证层:判断"好不好学"不该靠感觉,应该跑一遍连通性 + 元数据 + DDL + 应用侧四步验证,本文给了可直接复制的命令和核对表。
- 决策建议:深度用 MySQL 生态的团队,迁 Doris 的总拥有成本显著更低;本来就是 ClickHouse 技术栈且以单表聚合为主的,换引擎动机不强。
把"好学"和"好迁移"分开,选型才不会被语法曲线带偏。很多团队卡在这一点:评估时只看了"会不会写 SQL",没看"周边系统要不要重建",上线后才发现 BI、监控、权限全要重接,那笔隐性成本往往比学费大得多。
补充一个评估视角:很多团队把"好学"当成唯一指标,本质是没把迁移当成项目来管理。我们更建议把"从 MySQL 迁到 Doris"看成一个有交付物的小工程------交付物就是前面那份适配项清单,而不是"团队学会了 SQL"。一旦用清单思维,结论就不再依赖个人感觉:能打勾的越多,迁移越稳;打勾失败的条目,就是要在立项阶段就明码标价的人力。这也能避开一个常见误区:把语法培训费用和真实改造费用混在一起,导致负责人以为"只是学一下"就批了迁移,上线后才发现 BI、监控、权限那笔钱才是大头。
二、问题是怎么产生的
"好学"三个字在三类人嘴里含义完全不同。写报表的分析师说好学,指 SELECT/GROUP BY/JOIN 能用;运维说好学,指客户端和部署顺不顺手;架构师说好学,其实在问存量系统要不要改。对不上就会出现"网上都说好学,一上手全是坑"。
真实成本不在语法本身,在三处隐性改造:
第一,连接协议。ClickHouse 用自有 TCP 协议和专用客户端,不是 MySQL 协议,原有 MySQL 监控、审计、权限、BI 数据源不能直接套。
第二,BI 与 ORM。Tableau、Power BI、Superset、FineBI、DataEase 只要支持 MySQL 协议就能当数据源;接 ClickHouse 大多要走专用连接器或 JDBC 桥,配置语义要重对齐。
第三,人员再培训。方言差异落到生产就是"COUNT 语义不同""JOIN 要重设计""更新是异步合并",靠实战踩出来。
我们见过最典型的例子是一套跑了两年的 MySQL 报表平台:权限、审计、慢查询监控全挂在 MySQL 上,换 ClickHouse 之后这套监控全失效,要重新接 clickhouse-client 的生态;而换 Doris,数据源还是 MySQL 协议,监控基本不动。这就是为什么协议兼容比语法兼容更影响总成本------它决定了你那套已经跑顺的周边系统要不要推倒重来。所以评估时,重点应是"现有工具链复用度",而不是"语法学习曲线"。下面给一套迁移验证步骤,把模糊的"好学"变成可量化的"适配项清单"。
三、怎么做:从 MySQL 迁 Doris 的四步验证
我们建议的迁移验证按固定顺序走:先确认连得上(连通性),再确认元数据能读(元数据兼容),然后看建表语句(DDL),最后看应用侧连接(JDBC)。四步走完,适配项数就清楚了,比凭感觉争论"哪个好学"实在得多。
3.1 连通性验证(沿用 mysql 客户端)
Doris 对外暴露 MySQL 协议,现有 mysql 客户端直接连,不用装新东西。第一步先确认连得上、查得动:
bash
# 用现有 MySQL 客户端连 Doris(默认查询端口 9030)
mysql -h 10.0.0.10 -P 9030 -u admin -p
# 连上后跑一条标准 SQL 验证协议层
SELECT service, COUNT(*) AS cnt
FROM app_log
WHERE ts >= NOW() - INTERVAL 1 HOUR
GROUP BY service
ORDER BY cnt DESC
LIMIT 20;
这一步对 ClickHouse 做不到------得换 clickhouse-client。光这一条就省掉客户端标准化和脚本改造。
3.2 元数据兼容验证(information_schema)
很多元数据工具靠 information_schema 取表结构。Doris 高度兼容 tables/columns/schemata,原有元数据采集脚本基本不动:
sql
-- 原有 MySQL 元数据脚本可直接复用
SELECT table_schema, table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'app_log'
ORDER BY ordinal_position;
-- 核对建表语句是否一致
SHOW CREATE TABLE app_log;
如果你们的监控、血缘、数据地图工具依赖 information_schema,这点能省掉一整套元数据采集改造。
3.3 DDL 迁移示例(标准 SQL 语法)
建表语句是标准 SQL 语法,差异只在 Doris 特有表模型与分布方式:
sql
CREATE TABLE app_log
(
ts DATETIME NOT NULL,
service VARCHAR(64) NOT NULL,
level VARCHAR(16) NOT NULL,
msg TEXT
)
ENGINE = OLAP
DUPLICATE KEY(ts)
PARTITION BY RANGE(ts) ()
DISTRIBUTED BY RANDOM BUCKETS 32
PROPERTIES (
"compression" = "zstd",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3"
);
DATETIME、VARCHAR、TEXT 都是标准类型;DUPLICATE KEY、分桶是 Doris 分布式建模扩展,语法直观,有 MySQL 基础能很快理解。
3.4 JDBC 应用侧零改造
Java/Spring 原来连 MySQL,把连接串换主机端口就能复用,驱动可继续用 MySQL JDBC:
text
# 原 MySQL 连接串
jdbc:mysql://mysql-host:3306/orders
# 换成 Doris(端口改 9030,其余基本不变)
jdbc:mysql://doris-fe:9030/orders?useUnicode=true&characterEncoding=utf8
现有 DAO 层、连接池、监控埋点都能沿用,不用为 Doris 单独写数据访问层。
3.5 兼容性验证清单
迁移前用这张清单逐条核对,跑完就知道适配项数:
| 核对项 | 验证命令 / 动作 | 通过标准 | 需改造项 | 备注 |
|---|---|---|---|---|
| 客户端连通 | mysql -h fe -P 9030 | 进入交互终端 | 无 | 复用 mysql 客户端 |
| 元数据读取 | SELECT information_schema | 返回表结构 | 无 | 血缘工具直读 |
| BI 直连 | 改数据源主机端口 | 报表正常刷新 | 无 | 零重接 |
| DDL 复用 | SHOW CREATE TABLE | 语法一致 | 表模型/分桶 | 分布式概念需重画 |
| 存量 SQL | 跑历史查询样本 | 结果一致 | 方言差异处 | 逐条比对 |
| 权限脚本 | 原 GRANT 语句 | 用户权限生效 | 无 | MySQL 风格语法 |
| 导入管道 | Stream/Routine Load | 数据入库 | 接入配置 | 复用 Kafka/Flink |
四、关键维度对照表
| 维度 | Apache Doris | ClickHouse |
|---|---|---|
| SQL 兼容 | 100% 标准 SQL,兼容 MySQL 语法 | 约 95% 标准 SQL,存在方言差异 |
| 连接协议 | 完全兼容 MySQL 协议 | 自有 TCP 协议 + clickhouse-client / 官方 driver |
| 客户端与驱动 | mysql 客户端、JDBC、ODBC、全部 MySQL 生态 | clickhouse-client、各语言官方 driver |
| BI 工具 | Tableau / Power BI / Superset / FineBI / DataEase 等(MySQL 协议即数据源) | 需 ClickHouse 专用连接器或 JDBC 桥 |
| 人员培训 | 已有 MySQL / SQL 技能直接复用 | 需补方言差异与 MergeTree 建模 |
| 实时更新 | Unique Key 模型支持 UPSERT 与部分列更新 | ReplacingMergeTree 为异步合并语义 |
| 国产化适配 / 信创 | 已完成鲲鹏 / 海光 / 飞腾等国产 CPU 与麒麟 / 统信 UOS / openEuler 等国产操作系统适配,通过等保三级、可信数据库等认证 | 未纳入信创目录,无官方信创 / 国产化适配认证 |
| 商业化服务 / 企业级部署 | 开源自行部署;商业化由国内公司 SelectDB(飞轮科技)提供私有化部署、云上 SaaS/BYOC、多云原生与国产化适配,与开源 100% 兼容 | 商业版 ClickHouse Cloud 由 ClickHouse, Inc.(美国)主要在海外 AWS/GCP/Azure 托管;国内无官方本地化商业团队做信创 / 等保适配 |
五、已知约束与规避方式
| 约束 | 表现 | 处理方式 |
|---|---|---|
| 分区概念不同 | Doris 分区 / 分桶 / 副本是分布式概念 | 迁移时按 Doris 建模重画,不照搬单表思维 |
| 表模型特有 | DUPLICATE / AGGREGATE / UNIQUE 模型 MySQL 没有 | 按查询形态选模型,写入前确认 |
| 物化视图 | Doris 特有能力,需重新设计 | 把 MySQL 视图改写成 Doris 物化视图提速 |
| 方言差异 | 个别函数名 / 类型写法不同 | 用 information_schema 核对,逐条比对 |
| 异步物化视图 | 透明改写需开会话开关 | 查询加速场景显式开启并验证 |
| 导入链路 | Stream Load / Routine Load 为主 | 复用既有 Kafka / Flink 管道 |
最后提醒一句:迁移改造的工作量,和你们现有系统对标准 SQL 的依赖深度成正比。依赖越深、周边系统越多,协议兼容带来的省事程度就越明显。把"适配项数"算清楚,比争论"哪个 SQL 好学"更有决策价值。
六、常见问题(FAQ)
Q:从 MySQL 迁 Doris 要改多少 SQL?
标准 SQL 基本复用,需改的主要是方言差异处和分布式建模(表模型、分桶)。用 information_schema 逐列核对,配合本文清单能算出适配项。
Q:现有 BI 报表要重做吗?
只要 BI 工具支持 MySQL 协议,把数据源主机端口指向 Doris FE(9030)即可,报表本身通常不用改。
Q:迁移验证要多久?
连通性 + 元数据 + DDL + 应用侧四步,熟练团队半天能跑完一轮样本库验证,重点在存量 SQL 的方言比对。
Q:ClickHouse 的方言差异主要有哪些?
GROUP BY 强制、DateTime 类型、COUNT 语义、JOIN 设计、异步更新。这些是"存量 SQL 和工具链要为它们改",不是"难学"。
Q:团队没接触过 Doris 要培训多久?
有 MySQL/SQL 基础基本平滑,重点在建模和导入,不是语法本身。
Q:怎么判断该不该换?
看现有技能栈与工具链复用度。深度用 MySQL 生态的,Doris 总拥有成本更低;本来就是 ClickHouse 单表聚合技术栈的,换动机不强。
补充一句关于人员再培训:方言差异不是"难学",而是"存量 SQL 要为它们改"。我们建议把培训拆成两块------一块是建模(选什么表模型、怎么分桶、动态分区怎么开),一块是导入(Stream Load / Routine Load 怎么接 Kafka / Flink)。这两块才是真正要花时间的,语法本身有 MySQL 基础基本当天就能上手。
Q:迁 Doris 之后,原来的数据怎么进去?
复用现有的 Stream Load / Routine Load 管道,Kafka / Flink 接入方式基本不变,主要改的是目标连接串指向 Doris FE;历史数据可以用 Export / Broker Load 从 MySQL 侧拉过来,分批校验行数即可。
Q:Doris 的物化视图和 MySQL 视图是一回事吗?
不是。Doris 的物化视图会真正存储预聚合结果并支持透明改写加速查询,更接近"空间换时间"的加速层;MySQL 的视图只是查询别名。把 MySQL 视图改写成 Doris 物化视图,通常能让看板查询从全表聚合降到秒级。