这是《PostgreSQL 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 PostgreSQL 和 MySQL 都是成熟开源关系型数据库。选型要看事务模型、查询复杂度、生态、团队运维能力和成本,而不是只看单项 benchmark。
30.1 架构差异
| 维度 | PostgreSQL | MySQL |
|---|---|---|
| 进程模型 | 多进程 | 多线程 |
| 存储引擎 | 统一存储层 | Server + 存储引擎 |
| 主流引擎 | 内核存储 | InnoDB |
| 扩展方式 | 扩展生态强 | 插件生态与云分支 |
| 连接模型 | 进程连接,依赖连接池 | 线程连接 |
30.2 SQL 能力
PostgreSQL 优势:
- 窗口函数与 CTE 能力成熟;
- GROUPING SETS / ROLLUP / CUBE;
- DISTINCT ON;
- LATERAL;
- 丰富类型和操作符;
- JSONB 与 GiST/GIN;
- 自定义类型和扩展。
MySQL 优势:
- 生态广泛;
- 复制和运维经验普及;
- 常见 Web 业务上手快;
- 云服务支持成熟;
- 简单高并发 OLTP 场景表现稳定。
30.3 MVCC 差异
| 维度 | PostgreSQL | MySQL InnoDB |
|---|---|---|
| 旧版本位置 | 表内死元组 | Undo Log |
| 清理机制 | VACUUM | purge |
| 长事务影响 | 表膨胀、事务 ID 风险 | undo 膨胀 |
| 典型运维点 | autovacuum、表年龄 | purge、history list |
30.4 复制差异
PostgreSQL:
- 物理流复制;
- 逻辑复制;
- 发布订阅按库表选择;
- 支持跨版本升级。
MySQL:
- binlog 复制成熟;
- GTID 和半同步广泛使用;
- 组复制与集群方案多;
- 主从切换生态丰富。
30.5 JSON 对比
PostgreSQL JSONB:
SELECT * FROM events
WHERE payload @> '{"type":"pay"}';
支持二进制结构、GIN、生成列和丰富操作符。
MySQL JSON:
SELECT * FROM events
WHERE JSON_EXTRACT(payload, '$.type') = 'pay';
也支持函数索引和生成列,但语义和索引行为与 PostgreSQL 不同。
30.6 分区与 DDL
两者都支持分区,但分区键约束、分区管理和 DDL 锁行为不同。PostgreSQL 分区表唯一键必须包含分区键;MySQL 分区也有主键约束要求。迁移时必须重新验证 schema。
30.7 迁移注意
1. 类型映射
2. SQL 方言
3. 序列和自增
4. 空字符串与 NULL
5. 时区处理
6. 大小写敏感
7. 复制拓扑
8. 备份窗口
9. 应用驱动
10. 回滚方案
本章小结
PostgreSQL 更适合复杂查询、丰富类型、扩展能力要求高的系统;MySQL 在高并发简单 OLTP 和既有生态中依然很强。选型应以团队经验和业务负载为准。
思考题
- 两者的 MVCC 清理机制有什么差异?
- JSONB 和 MySQL JSON 各有什么特点?
- 哪些 SQL 迁移风险最高?
- 连接模型如何影响部署?
- 如何设计公平对比测试?