PostgreSQL vs MySQL vs MongoDB:关系型与文档型数据库选型决策

深度对比三大主流数据库 PostgreSQL、MySQL、MongoDB。从数据模型、ACID、查询能力、扩展性、JSON 支持、高可用、托管服务价格等 12 个维度逐项评分,按 8 个典型场景给出选型建议。

PostgreSQL、MySQL、MongoDB 是开发者最常见的数据库选型三选一。这三款数据库分别代表了关系型(传统 OLTP)、关系型(流行 Web)和文档型 NoSQL 三种范式。本文从 12 个维度逐项深度对比,帮你做出数据驱动的决策。

一句话总结:没有最好,只有最合适。选数据库 = 认清数据模型 + 预估扩展路径 + 匹配团队认知。


一、12 维度评分对比

1. 多维评分总表

维度PostgreSQLMySQLMongoDB
SQL 标准兼容⭐⭐⭐⭐⭐ 最完整⭐⭐⭐⭐ 较完整⭐⭐ 不支持
复杂查询⭐⭐⭐⭐⭐ CTE/窗口/递归⭐⭐⭐ 基础⭐⭐⭐ 嵌套查询
事务 ACID⭐⭐⭐⭐⭐ 完整⭐⭐⭐⭐ InnoDB OK⭐⭐⭐⭐ 多文档
JSON/文档⭐⭐⭐⭐⭐ JSONB 双模式⭐⭐⭐ JSON 列⭐⭐⭐⭐⭐ 原生文档
扩展性⭐⭐⭐⭐⭐ 自定义类型/函数/索引⭐⭐⭐ 有限⭐⭐⭐⭐⭐ 分片原生
性能(简单 OLTP)⭐⭐⭐⭐ 优秀⭐⭐⭐⭐⭐ 最快⭐⭐⭐⭐ 良好
水平扩展⭐⭐⭐ Citus/手动⭐⭐⭐⭐ 读写分离⭐⭐⭐⭐⭐ 原生分片
GIS 地理空间⭐⭐⭐⭐⭐ PostGIS⭐⭐ 有限⭐⭐⭐ GeoJSON
全文搜索⭐⭐⭐⭐⭐ 内置⭐⭐⭐ 依赖插件⭐⭐⭐⭐⭐ 原生 text index
托管服务⭐⭐⭐⭐ 较成熟⭐⭐⭐⭐⭐ 最广(RDS)⭐⭐⭐⭐⭐ Atlas
学习曲线⭐⭐⭐ 较陡峭⭐⭐⭐⭐⭐ 最简单⭐⭐⭐⭐ 中等
社区生态⭐⭐⭐⭐⭐ 极强⭐⭐⭐⭐⭐ 最广⭐⭐⭐⭐ 活跃

2. 关键维度详解

复杂查询能力(PostgreSQL 领先):

-- PostgreSQL:窗口函数 + CTE + 递归,MySQL 8.0 后逐步补齐
WITH RECURSIVE subordinates AS (
  SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, e.manager_id
  FROM employees e
  JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;

JSON/文档能力(各有千秋):

  • PostgreSQL JSONB:关系表 + JSONB 列,支持 GIN 索引,可 JOIN
  • MySQL 8 JSON:关系表 + JSON 列,有限索引支持
  • MongoDB:原生文档,BSON 格式,灵活但无 JOIN

水平扩展(MongoDB > MySQL > PostgreSQL):

MongoDB:原生分片 Cluster(mongos → config server → shard replica set)
MySQL:读写分离(MHA/读写组复制)+ ProxySQL,分片靠应用层
PostgreSQL:逻辑复制 + Citus 分布式扩展,或手动分库分表

二、托管服务价格对比

1. 主流云厂商托管数据库(月均价,约 2025Q4)

云厂商PostgreSQLMySQLMongoDB Atlas
AWSRDS PostgreSQL ~$14/月(db.t3.micro)RDS MySQL ~$14/月Atlas M10 起步 ~$57/月
阿里云RDS PG ~¥0.55/时(1c2g)RDS MySQL ~¥0.48/时需自建或合作商
腾讯云TDSQL PostgreSQL ~¥0.55/时TDSQL MySQL ~¥0.48/时无原生
Google CloudCloud SQL PostgreSQL ~$7.15/月Cloud SQL MySQL ~$7.15/月Atlas 集成

价格启示:PostgreSQL 和 MySQL 在云托管层面几乎同价;MongoDB Atlas 定价模型不同(按 RAM + Storage 计费),起步偏高但为托管体验付费。

2. 自建 vs 托管

维度自建(Docker/VPS)托管(RDS/Atlas)
成本低(仅机器费用)贵 2~5x
维护需专职 DBA(备份/监控/升级)全托管
弹性手动扩容自动扩缩
安全自行负责(补丁/审计)云厂商责任
SLA取决于团队99.95~99.99%
推荐个人/小团队/学习生产必选

三、场景选型决策

决策树(快速定位)

1. 数据是否需要强事务(ACID)和多表 JOIN?
   → 是 → 继续往下看关系型
   → 否(纯 JSON/日志/IoT 时序)→ MongoDB

2. 项目属于简单 CRUD / CMS / Blog?
   → 是 → MySQL(简单、快、文档多)
   → 否(复杂查询/分析/需要扩展能力)→ PostgreSQL

3. 是否需要地理空间(GIS)或向量搜索?
   → 是 → PostgreSQL(PostGIS/pgvector)
   → 否 → 继续

4. 是否已深度绑定 MySQL 生态(WordPress/旧项目迁移)?
   → 是 → MySQL
   → 否 → PostgreSQL

8 个典型场景推荐

场景推荐理由
通用 Web 应用/SaaSPostgreSQL功能全面,JSONB + ACID + 任意查询长期维护
简单 CMS/博客/电商MySQL足够用,生态广,WordPress/Shopify 等原生支持
内容管理(Schema 灵活)MongoDB无需设计 Schema,快速迭代
金融/电商核心交易PostgreSQLACID 最完整,窗口函数+聚合分析
实时分析/时序数据PostgreSQL + TimescaleDB扩展最强,窗口函数分析
地理位置/GIS 应用PostgreSQL + PostGISGIS 功能最强
海量日志/事件存储MongoDB水平扩展最简单,分片原生
已有 Oracle/SQL Server 迁移PostgreSQL兼容度最高,存储过程可直接迁移

四、迁移成本与路径

如果从现有数据库迁移到 PostgreSQL,评估成本:

从 → PostgreSQL难度工具
MySQL⭐⭐⭐ 中等pgloader(自动迁移)、AWS DMS
Oracle⭐⭐⭐⭐ 较难ora2pg、EDB Migration Toolkit
SQL Server⭐⭐⭐⭐ 较难pgloader + 手动调整
MongoDB⭐⭐⭐⭐⭐ 最难数据模型重构(文档→关系)

常见问题(FAQ)

MySQL 8.0 之后还有必要选 PostgreSQL 吗?

有必要。MySQL 8.0 补齐了窗口函数、CTE、JSON 函数等特性,但在以下维度 PostgreSQL 仍有明显优势:

  • 表分区、递归 CTE、LATERAL JOIN
  • Geospatial(PostGIS 无可替代)
  • 自定义类型/索引/函数
  • 逻辑复制(在主从异构场景有优势)

MongoDB 的 ACID 到底靠不靠谱?

MongoDB 4.0+ 支持多文档事务(Replica Set 级别),4.2+ 支持分片集群事务(借助两阶段提交)。但对于高频 OLTP 场景(每秒数千笔交易),关系型数据库的事务引擎(两阶段锁+a状态管理)仍然更成熟。

PostgreSQL 比 MySQL 慢吗?

不是。PostgreSQL 在简单 OLTP 场景可能略慢于 MySQL(InnoDB 的内聚锁实现更轻),但在以下场景 PostgreSQL 更快:

  • 复杂分析查询(并行查询、位图扫描)
  • 大表范围查询(BRIN 索引)
  • JSONB 操作(GIN 索引)
  • 高并发读(MVCC 无锁读)

相关阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「database」更多文章