做软件这行,最怕被问到的问题之一就是:数据库选型怎么选?尤其当候选名单里躺着 MySQL、Oracle、PGSQL、达梦(DM)的时候,会议室里的讨论很容易变成各派粉丝的辩论赛。有人看中 MySQL 的部署简单,有人迷信 Oracle 的老牌稳,有人夸 PGSQL 的功能全面,还有人直接说“信创项目必须用达梦”。这些说法都没错,但都不能直接当结论用。
这篇文章我想站在企业选型负责人的角度,把四个数据库放到同一个评估框架里做比较,不讲虚的,只讲怎么从业务需求、团队能力、成本预算、运维风险几个维度一步步排出优先级。适合正准备做技术选型、数据库迁移,或者要给公司写数据库选型方案的架构师、DBA 和 IT 负责人参考。看完整篇文章,你至少能拿出一份可以拿去开会讨论的评估清单,而不是一堆互相矛盾的产品参数。
1. 先立框架:选型比的不是单项指标
1.1 别被性能榜单带偏,先定义企业需要什么
很多选型讨论一开始就跑偏,开场就是“某某数据库每秒能跑多少万次查询”“哪个在 TPCC 里排第一”。说实话,这些数字对大多数企业意义不大,因为你的业务根本不是那种标准测试负载。选型真正要回答的问题,是企业未来几年要在这个数据库上跑什么业务、承受多大的并发、做到什么级别的可用性、由谁来维护、需要花多少钱。
我建议一开始先列一份需求清单,而不是参数清单。至少要把五件事写清楚:
- 业务类型:是纯在线交易(OLTP)、复杂分析(OLAP),还是两者混跑?这决定了数据库的核心侧重点。
- 数据一致性要求:订单、账务、库存类数据要强一致,日志、浏览记录、统计类数据可以接受稍晚一点看到结果。
- 可用性目标:能做到 99.9% 还是 99.99%?这直接关系要不要做双机房、容灾、自动切换。
- 团队能力:现有 DBA 和开发更熟悉哪个数据库?招人难度有多大?
- 合规和生命周期:有没有国产化替代要求?现有系统还要跑多少年?有没有必须兼容的旧系统?
这轮需求梳理做完,很多选项已经被自动淘汰了。比如一个纯互联网 API 服务,业务模式是简单的读写和水平扩展,那么 Oracle 的很多高级特性根本用不上,还要背上很高的授权成本;而一个传统政企核心系统,如果 SQL 里大量使用存储过程、复杂包、定时任务,那直接用 MySQL 迁移可能要把应用层翻个底朝天。
1.2 成本不只是看采购价,TCO 才是关键
企业选型经常犯一个毛病,就是只算软件授权费,忽略后面的运维和改造费用。尤其开源数据库,免费两个字很有迷惑性,但免费的不一定是便宜的。
我给常见的成本项分过类,大家可以照这个清单做预算:
- 软件授权/订阅:MySQL 有社区版,也有商业订阅;Oracle 按 CPU 或按用户收费,价格梯度很大;PGSQL 完全开源,没有授权费;达梦通常按项目或按核心数授权。
- 基础设施成本:服务器、存储、网络、备份空间。商业数据库往往对内存和磁盘 IO 的要求更高,而且不一定能很好跑在低配服务器上。
- 运维人力:数据库是天天要养的,备份、巡检、升级、故障恢复,都是人力和时间。开源库虽然免费,但出问题时社区工单不一定帮你兜底。
- 迁移改造成本:从旧库迁到新库,SQL 要改、存储过程要重写、接口要适配、数据要校验,这一块经常是总成本的大头。
- 培训成本:新招 DBA、给开发做语法培训、让运维熟悉监控工具,都是隐形成本。
我见过一个项目,Oracle 迁到 PGSQL,光是把几千个存储过程按新语法改写,就花了两个产品团队三个多月。这笔费用远远超过数据库软件本身。所以做选型对比的时候,不要只盯着 license 栏目,要把“三年总拥有成本”算出来,再放到决策表里。
1.3 建一张可复用的评估打分表
需求梳理完、成本模型建立后,我需要一张评估打分表把四个候选放到同一维度上比较。这里最重要的是统一打分口径,避免“性能”这种词被各人按自己的理解打分。
我常用的打分表长这样:
| 评估维度 | 权重(0-20%) | 说明 |
|---|---|---|
| 业务功能满足度 | 20% | 类型支持、SQL能力、事务、分区、高可用等是否满足核心需求 |
| 性能与扩展性 | 20% | 在POC环境中的吞吐、延迟、水平扩展能力 |
| 生态与工具链 | 15% | 监控、备份、ORM、ETL、第三方工具是否成熟 |
| 兼容性与迁移成本 | 15% | 与现有系统的语法、对象、接口的兼容程度 |
| 成本与许可 | 15% | 三年TCO、授权模式、商务风险 |
| 团队技能与学习成本 | 10% | 现有团队能否快速接手,市场上人才是否好招 |
| 供应商风险与合规 | 5% | 开源社区活跃度、厂商支持、信创要求等 |
每个维度按 0 到 5 分打分,再乘上权重,最后加总。这个表的好处是可以让所有参与选型的人把“感觉”变成可计算的分数,也能避免某个人因为喜欢某个数据库而在会议室里带节奏。后面我会用这四个候选数据库做一轮具体比较。
2. 四个候选的定性与细节
2.1 MySQL:互联网业务的默认选项
MySQL 在互联网圈子里普及度极高,几乎成了年轻开发者的默认数据库。它的核心优势是简单、直接、文档多、云平台支持度好,部署一台 MySQL 的步骤非常成熟,从裸机到容器化都能很快跑起来。
关键技术上,MySQL 的 InnoDB 存储引擎提供了事务和外键支持,配合主从复制、半同步复制,可以搭建出常见的读写分离架构。对于大部分中小型互联网业务,比如用户表、订单表、商品表,SQL 都是单表查询或简单多表关联,MySQL 的优化器完全够用。分库分表方案也相对成熟,遇到单机瓶颈时,可以通过应用层路由把压力分摊到多个实例。
但 MySQL 并不是万能的。它的优化器在复杂查询上是短板,几个大表做深度关联、复杂子查询、窗口函数,性能往往需要人工调优才能压出来;JSON 支持虽然有了,但功能丰富度、操作灵活性不如 PGSQL;原生分区表和并行查询能力也比较克制,遇到分析型负载会比较吃力。另外,如果团队之前主要写 Oracle 风格的 SQL,迁到 MySQL 后会发现很多习惯要改,比如空值排序、分页写法、存储过程的差异。
所以 MySQL 在我的选型框架里,定位是“稳妥的流量型选手”:高并发、简单事务、快速交付、团队熟悉,它都是很好的选择。但如果业务逻辑复杂、报表需求重、SQL 经常会写成大联查,就要谨慎。
2.2 Oracle:老牌商业数据库的高水位
Oracle 在复杂 SQL 处理、高可用架构、运维工具链和供应商支持上都相当成熟,这是它多年来在金融、政企、制造业客户中占据重要位置的根本原因。它的优化器经过大量真实场景打磨,对复杂 SQL 的执行计划判断能力确实强;RAC 架构可以让多个实例访问同一套存储,提供高可用和横向扩展能力;Data Guard 做容灾,ASM 管理存储,资源管理器控制负载,这些组合起来是一个很完整的体系。
但 Oracle 的问题也很明显。第一是授权费用高,而且随着硬件规模增长,费用会跟着涨。第二是运维门槛高,一个合格的 Oracle DBA 需要有很深的经验积累,市场上这类人才成本普遍不低。第三是部署和调优重,在很多虚拟化和国产化环境下,它未必是最灵活的那个选项。
在选型框架里,Oracle 适合的场景是:业务真的复杂到 MySQL/PGSQL 撑不住,或者系统对稳定性和服务响应要求极高,且预算充足。如果只是惯性选择“老系统用 Oracle,新系统也用 Oracle”,那很可能是在为用不到的功能付钱。
2.3 PGSQL:开源阵营的六边形战士
PGSQL(PostgreSQL)这几年在企业里越来越受欢迎,大家通常说它“功能丰富”。这个评价不是夸张:它原生支持复杂 SQL、窗口函数、CTE、JSON/JSONB、数组、地理信息、全文检索,扩展机制也非常灵活,需要什么能力可以自己加。
技术上,PGSQL 的 MVCC 做得相当完整,读写并发能力强,复杂查询优化器的成熟度在开源数据库里是第一梯队。它还支持表分区、逻辑复制、流复制、并行查询、FDW 外部数据源访问等,也就是说它不仅能当 OLTP 数据库,还可以胜任一定程度的分析型负载和数据处理管道。
PGSQL 的缺点很少出现在数据库本身,更多出现在团队和组织层面。一个长期写 MySQL 的团队切换到 PGSQL,会发现很多 SQL 行为不一样,比如事务隔离级别、索引方式、字符串拼接语法、upsert 写法,这些都需要重新适应。另外 PGSQL 的高并发写入场景,如果连接数开得很大,要注意配置 max_connections、共享缓冲区等参数,盲抄 MySQL 的配置思路往往会吃亏。
在我做的选型里,PGSQL 最适合“业务逻辑比较复杂、希望少建中间表、报表需求重、又不想为商业数据库付高价”的团队。它不一定是某项指标的最优解,但综合分数很高。
2.4 达梦(DM):信创环境里的兼容型选手
达梦数据库(DM)在国内信创和国产化替代背景下经常被提上议程。它提供多种兼容模式,最受关注的是 Oracle 兼容模式,很多从 Oracle 迁移过来的存储过程、包、触发器、序列,在达梦里能够以较低成本适配。这对有存量 Oracle 系统的政企和金融项目来说非常关键,因为迁移工作量直接决定了项目能不能按期落地。
达梦支持共享存储集群(DSC)、读写分离集群、MPP 等架构,也支持主流开发语言和常见中间件适配。在国产化整体方案里,它和国产操作系统、芯片、中间件的兼容性验证通常比开源数据库更顺畅,这是很多企业选择它的现实原因。
不过达梦的生态相对年轻。互联网上公开的踩坑经验、第三方监控工具、ORM 兼容资料都少很多,遇到一个古怪问题,可能要费更多时间去找厂商技术支持。它虽然兼容 Oracle,但并不是在所有功能上都和 Oracle 完全一致,比如有些内置包、数据类型、正则函数、动态 SQL 细节,还是需要人工改写。所以选达梦不是“选一个 Oracle 平替”,而是选一个“需要认真做兼容性验证的国产数据库”。
2.5 一张横向对比表
把四个数据库放到同一张表里,可以看得更清楚:
| 对比项 | MySQL | Oracle | PGSQL | 达梦DM |
|---|---|---|---|---|
| 授权模式 | 开源/商业订阅 | 商业授权,按CPU或用户 | 开源,免费 | 商业授权,按项目/核数 |
| 部署复杂度 | 低 | 高 | 中 | 中 |
| 高可用方案 | 主从复制、组复制 | RAC、Data Guard | 流复制、逻辑复制 | DSC、读写分离集群 |
| 复杂SQL优化 | 中等 | 很强 | 强 | 中上(兼容Oracle部分较优) |
| 存储过程/包 | 支持但简洁 | 非常成熟 | 支持PL/pgSQL | 有Oracle兼容模式 |
| 扩展性 | 分库分表 | 垂直扩展强 | 丰富扩展机制 | 分布式/MPP支持 |
| 生态工具 | 成熟 | 非常成熟 | 较成熟,增长快 | 相对较少 |
| 信创适配 | 一般 | 不占优势 | 需适配验证 | 原生适配 |
| 团队学习成本 | 低 | 高 | 中 | 中(与Oracle相似) |
这张表只是给一个初步印象,实际打分必须结合自己的业务场景。下一部分我就按几类典型企业场景来聊,怎么基于这张表做落地的取舍。
3. 按场景做决策,而不是按名气做决策
3.1 互联网在线交易场景:MySQL 是稳定底盘,PGSQL 是升级选项
如果业务是典型的互联网应用,比如用户注册登录、商品浏览、订单创建,并发高但单个请求逻辑不复杂,那么 MySQL 仍然是非常稳的选择。主从复制做读写分离、分库分表做水平扩展,这些路径都很成熟,云厂商的托管 MySQL 也能省掉很多运维负担。
但如果业务里混入了审核流、多级审批、复杂的关联报表、灵活字段,甚至要存 JSON 做配置扩展,我会建议认真考虑 PGSQL。举个例子,一个订单系统如果既要高效写入订单表,又要经常按多个维度做统计报表,PGSQL 的窗口函数和并行查询能少写很多临时表,应用层维护成本更低。这里的取舍不是“谁快谁慢”,而是“哪个库能让我少造轮子”。
另外团队背景很重要。一个全是 MySQL 背景的团队,即使 PGSQL 技术优势明显,你要评估两到三个月的学习代价。反过来,如果团队本身就是写 Python/PHP 且用过 PGSQL,那选 PGSQL 就很自然。选型不能只给老板看技术报告,还要看背后的人能不能把方案做起来。
3.2 存量 Oracle 系统迁移:先评估复杂度,再定去留
很多企业不是从零选型,而是有一个已经跑了很多年的 Oracle 系统,因为 license 成本、信创要求或运维压力,必须换掉。
这个场景最忌讳一上来就拍板“迁到 PG”或“迁到达梦”。第一件事是做存量对象的复杂度扫描:有多少表、存储过程、包、触发器、序列、视图、定时任务?里面用了哪些 Oracle 独特语法?代码里是简单 SQL 为主,还是大量嵌套、动态 SQL、集合变量?扫描完才能知道迁移工作量有多大。
如果核心需求是快速完成国产化替代,且原有代码高度依赖 Oracle 存储过程,那么达梦的 Oracle 兼容模式往往能省下大量改造量。这里要强调,只是“往往”,不是“必然”,每个内置包、每条语法都得用测试用例验证,不能只看兼容性文档说支持就当支持。
如果迁移的另一个目标还包括消除高昂授权成本、把架构做现代化改造,那 PGSQL 是很有吸引力的目标库。但要做好心理准备:PL/SQL 到 PL/pgSQL 的改写量不小,尤其遇到包内全局变量、批量收集(BULK COLLECT)、管道函数这种高级功能时,可能要改写成不同的设计。
3.3 分析型与混合负载:数据库边界在哪里
数据库选型里最常见的失败案例,是希望一个数据库既扛住高并发写入,又能跑复杂的统计报表。实际上,大部分数据库都是偏向某一端的,强行混跑容易互相拖累。
如果报表查询很重、动辄扫几亿行、要跑很复杂的聚合,MySQL 肯定不是首选。PGSQL 配合并行查询、分区表、物化视图,能在同一个库里撑住中等规模的分析需求,省掉一套实时数仓的运维成本。Oracle 也能做,但前提是你愿意为它的性能和稳定性付授权费。达梦在分析型场景上也在补齐能力,但到了数据仓库级别,它更多时候还是要和 MPP 架构或独立数仓产品配合。
我的建议是:不要指望一个选型解决所有问题。可以把核心交易库和分析库分开选型,交易库在 MySQL/PGSQL 之间选,分析库则取决于团队的数仓技术栈。这样可以每个数据库做自己最擅长的事。
3.4 信创选型:达梦之外还要看适配清单
如果项目有明确的信创要求,选达梦的理由通常不是技术指标,而是整体生态适配和政策执行成本。这种情况下,决策重心会从“数据库性能比较”转移到“全链路兼容性验证”。
要重点检查几个环节:应用服务器用的中间件是否在达梦的认证名单里;操作系统和 CPU 环境是否已验证过;开发用的 ORM 框架是否支持达梦的方言;现有运维监控平台有没有对应的 agent 或采集方式。这些有一个环节卡住,都可能让项目延期。
即使是信创项目,也不一定要在所有系统里都用同一款数据库。核心交易库用达梦,边缘系统用 PGSQL 或其他国产分支,都是常见组合。关键是提前和各方确定清楚适用范围,避免后期出现“人人都说达标,到现场才发现连不上”的尴尬。
4. 实操过程:从需求到落地的完整选型路径
4.1 第一阶段:需求清单与POC设计
选型不能靠开会拍脑袋,要跑一轮 POC(概念验证)。POC 不是把四个数据库都装起来跑一遍标准测试,而是用自己业务里最有代表性的 SQL 和场景去检验。
第一步,收集 20 到 30 条核心 SQL,包括高频查询、低频报表、事务写入和批量操作。第二步,定义可量化的指标,比如每秒事务数、99 分位延迟、日志积压量、备份耗时。第三步,准备和真实业务量级相当的数据,至少不能只拿几千行表做测试,否则复杂查询的索引和执行计划根本体现不出来。
POC 里还必须加入故障演练。主节点挂掉后切换时间多久?数据丢失多少?备份恢复能否成功?这些在厂商白皮书里都写得很完美,但只有亲手做一遍才靠谱。
4.2 第二阶段:成本与风险测算
POC 完成后,把结果换算成可比较的总拥有成本。我习惯做一个三年成本估算表,至少包含以下项目:
- 软件授权/订阅费:商业库按实际申请配置估算,开源库按商业支持或云托管价格估算。
- 服务器和存储:根据 POC 压测结果估算需要的 CPU、内存、磁盘容量。
- 运维人力:按专职 DBA 人数乘以平均周工作时长估出一个折合成本。
- 迁移与改造:按对象数量、代码行数、预估人天乘以单价计算。
- 培训与磨合:给团队留一个月学习时间和一个月的缓冲。
风险成本也要估算。比如选了一个社区资料少的库,遇到生产事故时排查时间可能增加,这种风险虽然无法精确到元,但要在决策表里体现,尤其是在没有厂商兜底项目经验的情况下。
4.3 第三阶段:迁移和验证的关键点
确定目标库后,迁移验证有几个容易踩坑的地方。
数据迁移阶段,建表语句里的数据类型要逐项映射。Oracle 的 NUMBER 到 PGSQL 可能变成 NUMERIC,但精度和行为有细微差异;VARCHAR2 在达梦里可能按字节计算长度,而原库按字符计算,一旦有中文,长度会不够;CLOB、BLOB、JSON 等类型的访问方式也要重新验证。
SQL 改写阶段,重点检查三类语法:分页写法、日期函数、递归查询。Oracle 用 ROWNUM 做分页,PGSQL/MySQL 用 LIMIT 和 OFFSET,达梦兼容模式各有不同;日期函数在不同库里同名但行为不一致;递归查询在 Oracle 里是 CONNECT BY,在 PGSQL 里是 WITH RECURSIVE,在达梦的兼容模式里可能两者都支持但写法有限制。
性能回归阶段,迁移后不能只测功能,要对比执行计划。一个 SQL 在 Oracle 里走索引,在 PGSQL 里可能因为统计信息没更新或参数不同变成全表扫描。迁移后要统一做一次索引和统计信息优化,再用 POC 里的 SQL 重新跑一遍指标,确保和旧库在同一个水平线,不能降一档。
4.4 一个模拟项目的选型复盘
用我最近参与评估的一个模拟项目X来举例。它是一个用户中心系统,包含用户档案、组织机构、权限分配和登录日志,数据量不大,但有十几张表经常做多表关联,而且有大量存储过程需要保留。原有环境偏向 Oracle,团队会写 PL/SQL,但预算有限,且有信创考核要求。
候选库聚焦在 PGSQL 和达梦之间。第一轮用评分表打分,PGSQL 在功能与生态上略胜,达梦在信创适配与迁移成本上占优。第二轮做 POC,拿 50 条核心 SQL 分别跑,两边性能都达标,但在存储过程迁移验证时,PGSQL 的改写量明显更大,很多包逻辑需要重写测试;达梦则可以直接建 Oracle 兼容模式,大部分逻辑跑通,只有少数内置函数需要手工适配。
最终选择达梦,项目按期完成。整个过程最大的感受是:功能评分最高的库,不一定是最合适的库;谁能让团队在可接受的时间窗口内安全落地,谁才是最终答案。
5. 避坑清单和决策速查
5.1 常见问题速查表
| 问题 | 原因 | 处理建议 |
|---|---|---|
| “MySQL 比 PGSQL 快吗?” | 脱离场景比性能没有意义 | 用自己业务 SQL 和数据量做 POC |
| “Oracle 兼容模式等于完全兼容?” | 兼容不等于全功能等价 | 逐项测试,不只看文档 |
| “PGSQL 能完全替代 Oracle 吗?” | 部分高级特性差异大 | 提前盘点存储过程和内置包 |
| “开源数据库零成本?” | 忽略运维、迁移、培训 | 按三年 TCO 计算 |
| “信创选达梦就够了?” | 还需中间件、ORM、芯片适配 | 全链路兼容性验证 |
| “分库分表能解决所有 MySQL 问题?” | 分布式会带来一致性复杂性 | 优先确认是否必须分片 |
5.2 最终决策的五问
选型报告写到最后,我通常会回到五个问题:
- 业务最不能接受的风险是什么?是审批延迟、数据出错、还是长期成本失控?
- 团队真正擅长什么?如果现有团队只有 MySQL 经验,三天内能招到 PGSQL 或达梦 DBA 吗?
- 这套系统预期寿命是多少年?未来三年内的数据量、并发量、功能复杂度会增长多少?
- 谁来为数据库的长期运维负责?厂商支持能做到几小时响应,还是只能靠社区慢慢搜?
- 能不能先做一个小范围试点?让核心团队在真实业务上试跑三个月,再决定全面推广?
这些问题没有标准答案,但每个答案都会帮你排除掉一个选项。数据库选型最怕的不是选错,而是不给自己留验证空间。
5.3 我个人踩坑后的几条经验
做了几次选型之后,我最大的体会是:数据库选型本质上是风险管理,不是技术评选。你选的不是“最强”的数据库,而是“出了问题最扛得住”的数据库。
之前有一次我们想省 license 费,把一个小型账务系统从商业库迁到开源库,POC 里一切正常,生产上线后发现一个由字符排序规则引起的查询性能问题,排查了很久才定位到 collation 配置差异。从那以后,我要求所有迁移项目都必须保留旧库数据至少一个完整的账期,并且提前设计回滚方案,哪怕回滚概率很低。
另一个教训是:厂商白皮书和网上评测都只是参考,最可信的是自己团队亲手跑出来的故障恢复时间。真正需要做决策的时候,不要问“这个库有什么”,要问“这个库坏了怎么办”,答案能让你清醒很多。选型后续还可以继续做性能压测、读写分离策略、高可用切换演练,但最开始,先把需求和团队的底牌摸清楚,比研究参数重要得多。