两大主流关系型数据库的全面对比:架构原理、核心差异、适用场景
| 维度 | PostgreSQL | MySQL |
|---|---|---|
| 诞生年份 | 1996(加州大学伯克利) | 1995(MySQL AB公司) |
| 类型 | 高级关系型数据库(ORDBMS) | 传统关系型数据库(RDBMS) |
| 哲学 | 追求功能完备与标准遵循 | 追求简单、高效、可靠 |
| License | PostgreSQL License(BSD) | GPL / 商业许可 |
PostgreSQL 采用"每连接一进程"模型,每个客户端连接由独立的 postgres 后端进程 处理。
所有后端进程共享一块内存区域,避免数据不一致。
PostgreSQL 通过 MVCC 实现读写不互斥的并发控制,让读操作永不阻塞写操作。
BEGIN;
UPDATE users SET name='Alice' WHERE id=1;
SELECT * FROM users WHERE id=1;
→ 看到 name='Tom'
(因为事务 A 还未提交)
COMMIT;
→ 仍看到 name='Tom'
(快照隔离!事务 B 的快照从 T2 就锁定了)
适用:=, <, >, <=, >=, BETWEEN, LIKE
最通用的索引类型,平衡读写性能。
适用:= 精确匹配
不支持范围查询,但等值查询最快。
适用:地理位置、全文检索、树形结构
PostGIS 插件使用此索引。
适用:JSONB、数组、全文搜索
适合多值列(数组包含查询)。
适用:时序数据、日志、顺序写入的大表
空间极小(O(1)),适合物理顺序与值相关的场景。
适用:只索引满足条件的行
CREATE INDEX ON orders WHERE status='pending'
| 特性 | PostgreSQL | MySQL |
|---|---|---|
| MVCC | ✅ 原生,所有隔离级别 | ⚠️ 仅 REPEATABLE READ |
| 数组类型 | ✅ 原生支持 | ❌ 需 JSON 模拟 |
| JSONB | ✅ 高性能二进制存储 | ⚠️ JSON 支持 |
| 窗口函数 | ✅ 完全支持 | ⚠️ MySQL 8.0+ |
| CTE/递归 | ✅ 完全支持 | ⚠️ MySQL 8.0+ |
| 物化视图 | ✅ 支持 | ❌ 需手动实现 |
| 并行查询 | ✅ 多核并行 | ⚠️ 有限支持 |
| FDW | ✅ 万物皆表 | ❌ 不支持 |
| GIS 支持 | ✅ PostGIS 强大 | ⚠️ 基础支持 |
| 向量检索 | ✅ pgvector | ⚠️ 需第三方 |
MySQL:简单、快速、互联网标配 → PostgreSQL:功能完备、企业级、标准遵循
MySQL 追求 pragmatism(实用主义),PostgreSQL 追求 correctness(正确性)。两者都是优秀的选择,关键在于理解你的业务场景。