PostgreSQL、MySQL、MongoDB 是开发者最常见的数据库选型三选一。这三款数据库分别代表了关系型(传统 OLTP)、关系型(流行 Web)和文档型 NoSQL 三种范式。本文从 12 个维度逐项深度对比,帮你做出数据驱动的决策。
一句话总结:没有最好,只有最合适。选数据库 = 认清数据模型 + 预估扩展路径 + 匹配团队认知。
一、12 维度评分对比
1. 多维评分总表
| 维度 | PostgreSQL | MySQL | MongoDB |
|---|---|---|---|
| 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)
| 云厂商 | PostgreSQL | MySQL | MongoDB Atlas |
|---|---|---|---|
| AWS | RDS 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 Cloud | Cloud 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 应用/SaaS | PostgreSQL | 功能全面,JSONB + ACID + 任意查询长期维护 |
| 简单 CMS/博客/电商 | MySQL | 足够用,生态广,WordPress/Shopify 等原生支持 |
| 内容管理(Schema 灵活) | MongoDB | 无需设计 Schema,快速迭代 |
| 金融/电商核心交易 | PostgreSQL | ACID 最完整,窗口函数+聚合分析 |
| 实时分析/时序数据 | PostgreSQL + TimescaleDB | 扩展最强,窗口函数分析 |
| 地理位置/GIS 应用 | PostgreSQL + PostGIS | GIS 功能最强 |
| 海量日志/事件存储 | 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 无锁读)
相关阅读
- PostgreSQL 详解 — 核心架构、MVCC、JSONB、安装
- PostgreSQL Docker 部署 — 容器化快速搭建
- PostgreSQL 性能优化 — EXPLAIN、索引、调参
- PostgreSQL SQL 进阶查询 — 窗口函数、CTE、递归
- PostgreSQL 高可用与备份 — 流复制、Patroni
- PostgreSQL 安全与权限管理 — RLS、SSL、审计
- PostgreSQL 专题导航
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。