PostgreSQLNotes

第 30 章:与 MySQL 对比

zjc 于 2026-01-30 发布

这是《PostgreSQL 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 PostgreSQL 和 MySQL 都是成熟开源关系型数据库。选型要看事务模型、查询复杂度、生态、团队运维能力和成本,而不是只看单项 benchmark。

30.1 架构差异

维度 PostgreSQL MySQL
进程模型 多进程 多线程
存储引擎 统一存储层 Server + 存储引擎
主流引擎 内核存储 InnoDB
扩展方式 扩展生态强 插件生态与云分支
连接模型 进程连接,依赖连接池 线程连接

30.2 SQL 能力

PostgreSQL 优势:

  1. 窗口函数与 CTE 能力成熟;
  2. GROUPING SETS / ROLLUP / CUBE;
  3. DISTINCT ON;
  4. LATERAL;
  5. 丰富类型和操作符;
  6. JSONB 与 GiST/GIN;
  7. 自定义类型和扩展。

MySQL 优势:

  1. 生态广泛;
  2. 复制和运维经验普及;
  3. 常见 Web 业务上手快;
  4. 云服务支持成熟;
  5. 简单高并发 OLTP 场景表现稳定。

30.3 MVCC 差异

维度 PostgreSQL MySQL InnoDB
旧版本位置 表内死元组 Undo Log
清理机制 VACUUM purge
长事务影响 表膨胀、事务 ID 风险 undo 膨胀
典型运维点 autovacuum、表年龄 purge、history list

30.4 复制差异

PostgreSQL:

  1. 物理流复制;
  2. 逻辑复制;
  3. 发布订阅按库表选择;
  4. 支持跨版本升级。

MySQL:

  1. binlog 复制成熟;
  2. GTID 和半同步广泛使用;
  3. 组复制与集群方案多;
  4. 主从切换生态丰富。

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 和既有生态中依然很强。选型应以团队经验和业务负载为准。

思考题

  1. 两者的 MVCC 清理机制有什么差异?
  2. JSONB 和 MySQL JSON 各有什么特点?
  3. 哪些 SQL 迁移风险最高?
  4. 连接模型如何影响部署?
  5. 如何设计公平对比测试?