Skip to content

附录 A:PostgreSQL vs MySQL 对比速查表

工具书用法:遇到"PG 和 MySQL 到底哪里不一样"的问题,按目录跳着查即可。 对比版本:PostgreSQL 16 vs MySQL 8.0 / InnoDB

目录

  1. 总体定位
  2. 进程 / 线程模型
  3. 连接处理
  4. 数据类型
  5. DDL 差异
  6. DML 差异
  7. 索引体系
  8. 事务与隔离级别
  9. MVCC 实现
  10. 锁机制
  11. 日志体系
  12. 复制与高可用
  13. 分区
  14. 备份恢复
  15. 存储过程 / 触发器 / 函数
  16. JSON 支持
  17. 全文检索
  18. 扩展生态
  19. 常用工具链
  20. 选型建议
  21. 常见误区 / 速查口诀

1. 总体定位

维度PostgreSQLMySQL
开源协议PostgreSQL License(类 BSD / MIT,宽松)GPLv2(Oracle 持有商业版)
维护方PGDG 社区(无单一公司)Oracle(分支 MariaDB / Percona)
SQL 标准遵循度高(贴近 SQL:2016)中(方言多)
设计哲学对象-关系(ORDBMS)+ 可扩展关系(RDBMS)+ 可插拔存储引擎
可扩展性CREATE EXTENSION 一行装扩展靠存储引擎(InnoDB/RocksDB 等)
默认端口 / 管理员5432 / postgres3306 / root

2. 进程 / 线程模型

维度PostgreSQLMySQL (InnoDB)
基本模型多进程(每连接一个 backend)多线程(每连接一个 thread)
单连接开销较重(~10MB 起)较轻(几 KB ~ 几 MB)
崩溃隔离进程崩只影响自己线程 core 可能拖垮实例
共享内存shared_buffersinnodb_buffer_pool_size
后台进程checkpointer / bgwriter / walwriter / autovacuumInnoDB master / purge / page cleaner
高并发短连接必须加连接池thread cache 可扛

3. 连接处理

维度PostgreSQLMySQL
max_connections 推荐100~300300~3000
连接池强烈必要(PgBouncer / pgcat)可选(HikariCP 即可)
连接池模式session / transaction / statement一般 session
空闲连接每个占 ~10MB RSS占用少
SSL 参数sslmode=require/verify-full--ssl-mode=REQUIRED

4. 数据类型

4.1 整型 / 浮点 / 定点

场景PostgreSQLMySQL备注
1 字节整型无(用 smallintTINYINTPG 无 1 字节整数
2/4/8 字节整型smallint / integer / bigintSMALLINT / INT / BIGINT-
自增SERIAL / IDENTITY(推荐 IDENTITYAUTO_INCREMENTPG 基于 sequence
浮点real / double precisionFLOAT / DOUBLE-
定点numeric(p,s)(无参 = 任意精度)DECIMAL(p,s)(默认 (10,0)PG 禁用无参 numeric,性能差
货币money(受 locale 影响,不推荐)DECIMAL-

4.2 字符串

类型PostgreSQLMySQL备注
定长char(n) 补空格CHAR(n) 补空格两边都有尾空格陷阱
变长varchar(n) / text(推荐)VARCHAR(n) / TEXT/MEDIUMTEXT/LONGTEXTPG varchartext 性能一致
最大长度1GB(超大值自动 TOAST)65535 / 16MB / 4GB 分级-
字符集库级统一(推荐 UTF8库 / 表 / 列 / 连接四层PG 简单

4.3 日期时间(含时区)

类型PostgreSQLMySQL备注
日期 / 时间date / timeDATE / TIME-
时间戳(无时区)timestampDATETIME-
时间戳(带时区)timestamptz(推荐)TIMESTAMP(行为类似)TIMESTAMP 有 2038 问题
时间间隔interval 原生无(用 DATE_ADDPG 独有
时间戳范围4713 BC ~ 294276 AD1970 ~ 2038 / 1000 ~ 9999-

4.4 其它类型(PG 大招区)

类型PostgreSQLMySQL备注
布尔boolean(true/false/null)BOOLEAN = TINYINT(1)MySQL 伪布尔
UUIDuuid 原生 16 字节CHAR(36) / BINARY(16)PG 有专属函数
JSONjson(文本)JSON(二进制)PG 用 json 不推荐
JSONBjsonb 二进制,GIN 索引 + 运算符丰富JSONPG 杀手锏
数组int[] / 任意类型[]PG 原生 + unnest
范围int4range / tsrange / numrange预约系统友好
枚举CREATE TYPE ... AS ENUM(...) 独立类型ENUM(...) 列级PG 可跨表复用
网络地址inet / cidr / macaddr-
几何内置几何 + PostGIS内置 SpatialPostGIS 远强
向量pgvectorvector(1536)8.0 无官方AI/RAG 决定性优势

5. DDL 差异

维度PostgreSQLMySQL备注
自增列IDENTITY(推荐)/ SERIALAUTO_INCREMENT回滚都不回退号
建库语法CREATE DATABASE x OWNER u ENCODING 'UTF8' TEMPLATE template0;CREATE DATABASE x DEFAULT CHARSET utf8mb4;PG 可克隆模板库
CHECK 约束原生8.0.16+ 才生效-
外键支持 + DEFERRABLE 延迟检查支持,不支持延迟PG 延迟约束很有用
ALTER ADD COLUMNPG11+ 带常量默认值秒级;带 now() 仍重写8.0 INSTANT 秒级两家都优化了
ALTER 改类型大多重写,但可 USING 表达式 转换大多重写-
DROP TABLE CASCADE支持(自动删依赖)手工删PG 更方便
DDL 事务所有 DDL 可回滚DDL 隐式提交PG 迁移脚本超爽

6. DML 差异

维度PostgreSQLMySQL
UPSERTINSERT ... ON CONFLICT (col) DO UPDATE SET ...INSERT ... ON DUPLICATE KEY UPDATE ...
忽略冲突ON CONFLICT DO NOTHINGINSERT IGNORE
RETURNINGINSERT/UPDATE/DELETE ... RETURNING ...无,靠 last_insert_id()
UPDATE ... FROMUPDATE t SET ... FROM o WHERE t.id=o.idUPDATE t JOIN o ... SET ...
DELETE ... USINGDELETE FROM t USING o ...DELETE t FROM t JOIN o ...
LIMITLIMIT n OFFSET mLIMIT m, n(MySQL 方言)
CTE / 递归 CTE原生、可控物化8.0+ 支持
窗口函数齐全(FILTER / GROUPS 帧)8.0+ 基本集
批量导入COPY / \copy(极快)LOAD DATA INFILE
GROUP BY 严格度严格(SELECT 列必须在 GROUP BY 或聚合)默认宽容
FOR UPDATE SKIP LOCKED9.5+ 支持8.0+ 支持

7. 索引体系

维度PostgreSQLMySQL (InnoDB)
主要索引B-Tree(堆表 + 索引分离)B+Tree(聚簇,数据随主键物理排序)
其它索引类型Hash / GIN / GiST / SP-GiST / BRINHash(Memory)/ R-Tree / Fulltext
覆盖索引CREATE INDEX ... INCLUDE (col)复合索引覆盖
表达式索引CREATE INDEX ON t ((lower(name)))8.0+ 函数索引
部分索引CREATE INDEX ... WHERE deleted = false不支持
并发建索引CREATE INDEX CONCURRENTLYALGORITHM=INPLACE, LOCK=NONE
全文GIN + tsvectorFULLTEXT
数组 / JSONBGIN 成熟8.0 多值索引
地理 / 向量GiST + PostGIS / pgvector HNSWR-Tree(弱)
无序插入代价堆表追加到满足 FSM 的页(几乎无代价)聚簇随机插 → 页分裂

8. 事务与隔离级别

维度PostgreSQLMySQL
默认隔离级别READ COMMITTEDREPEATABLE READ
READ UNCOMMITTED等同 RC(不真脏读)真脏读
REPEATABLE READ事务级快照,不可重复读 / 幻读都杜绝可能幻读(Next-Key 缓解)
SERIALIZABLESSI(乐观)Gap/Next-Key 锁(悲观)
保存点SAVEPOINT / ROLLBACK TO
两阶段提交PREPARE TRANSACTIONXA 事务
事务失败行为语句出错,整个事务作废,配 SAVEPOINT 化解只有错误语句失败,事务可继续
事务 ID32 位 xid(需 VACUUM 防冻结)InnoDB 64 位

9. MVCC 实现

维度PostgreSQLMySQL (InnoDB)
多版本位置堆表里多版本元组(xmin/xmax)Undo Log + 聚簇最新版本
旧版本回收VACUUM / autovacuumPurge 线程回收 Undo
长事务影响表 / 索引膨胀Undo 链 / history list 膨胀
可见性判断比较 xmin/xmax 与快照比较 trx_id 与 ReadView
更新代价HOT:同页更新不改索引;非 HOT:新元组 + 索引更新聚簇 in-place + 写 Undo
可观察元数据xmin/xmax/ctid 系统列可直接查不直接可见

10. 锁机制

维度PostgreSQLMySQL (InnoDB)
表锁模式数8 种(ACCESS SHARE / ROW SHARE / ROW EXCLUSIVE / SHARE UPDATE EXCLUSIVE / SHARE / SHARE ROW EXCLUSIVE / EXCLUSIVE / ACCESS EXCLUSIVE)3 种 + 意向锁(IS/IX/S/X)
行锁实现元组头 xmax 标记(零内存开销)索引行锁结构(内存)
行锁语法FOR UPDATE / FOR SHARE / FOR NO KEY UPDATE / FOR KEY SHAREFOR UPDATE / FOR SHARE
间隙锁 / Next-Key(靠 SSI)RR 下默认有
咨询锁pg_advisory_lock(key)GET_LOCK('name')
死锁deadlock_timeout 后检测立即检测
锁查看pg_locks / pg_blocking_pids()performance_schema.data_locks

11. 日志体系

维度PostgreSQLMySQL
数量1 套:WAL3 套:Redo + Undo + Binlog
崩溃恢复WALRedo
MVCC 旧版本不单列 Undo(旧版本在堆里)Undo
复制逻辑层复用 WAL(wal_level=logicalBinlog
内部两阶段提交不需要需要(Redo prepare / Binlog / Redo commit 保证一致)
同步级别参数fsync / synchronous_commitinnodb_flush_log_at_trx_commit / sync_binlog
日志查看pg_waldumpmysqlbinlog

12. 复制与高可用

维度PostgreSQLMySQL
物理复制流复制(基于 WAL 字节流)无直接对等
逻辑复制PUBLICATION / SUBSCRIPTIONBinlog 复制(默认逻辑)
同步模式async / remote_write / remote_flush / remote_apply / quorumasync / semi-sync / MGR
复制延迟观察pg_stat_replication.lagSeconds_Behind_Master
多主BDR / pglogical(第三方)Group Replication(MGR)
高可用方案Patroni(+ etcd)主流MGR / InnoDB Cluster / MHA / Orchestrator
DDL 复制逻辑复制不复制 DDLBinlog 复制 DDL

13. 分区

维度PostgreSQLMySQL
分区方式RANGE / LIST / HASH(PG10+ 声明式)RANGE / LIST / HASH / KEY
分区裁剪默认开启支持
默认分区PARTITION OF t DEFAULT
子分区多级支持subpartition
分区上的外键PG12+ 完整支持不支持
自动分区pg_partman + pg_cron
水平分片CitusVitess

14. 备份恢复

维度PostgreSQLMySQL
逻辑备份pg_dump / pg_dumpallmysqldump / mysqlpump
物理备份pg_basebackup(在线自带)xtrabackup(Percona)
专业工具pgBackRest / Barman / wal-gxtrabackup / clone plugin
增量pgBackRest / wal-gxtrabackup incremental
PITRrecovery_target_time + WAL 归档Binlog + 基础备份 replay
角色 / 权限pg_dump 不备份,需 pg_dumpall -gmysqldump 不备份 mysql 库

15. 存储过程 / 触发器 / 函数

维度PostgreSQLMySQL
过程化语言PL/pgSQL + PL/Python / Perl / V8 / JavaSQL/PSM
FUNCTION vs PROCEDURE函数有返回;PROCEDURE(PG11+)可 COMMIT有 FUNCTION / PROCEDURE
返回多行RETURNS TABLE / SETOF游标 / 临时表
触发器BEFORE / AFTER / INSTEAD OF(视图) / 语句级BEFORE / AFTER,仅行级
事件触发器CREATE EVENT TRIGGER(DDL 触发,PG 独有无对等
LISTEN / NOTIFY内置发布订阅(PG 独有
规则系统CREATE RULE

16. JSON 支持

运算PostgreSQL (JSONB)MySQL (JSON)
取字段(返 json)data -> 'k'JSON_EXTRACT(data,'$.k') / data->'$.k'
取字段(返 text)data ->> 'k'data->>'$.k'
路径取值data #> '{a,b}' / #>>JSON_EXTRACT(data,'$.a.b')
包含判断data @> '{"k":"v"}' ✅走 GINJSON_CONTAINS(...)
键存在data ? 'k' / `?/?&`
合并`a
设置路径jsonb_set(data,'{a,b}','1'::jsonb)JSON_SET(data,'$.a.b',1)
构造对象 / 数组jsonb_build_object/arrayJSON_OBJECT/ARRAY
聚合jsonb_agg / jsonb_object_aggJSON_ARRAYAGG / JSON_OBJECTAGG
展开为行jsonb_array_elementsJSON_TABLE
路径查询(SQL:2016)jsonb_path_query / _existsJSON_EXTRACT 简单路径
索引GIN on jsonb(成熟)多值索引(8.0+)

17. 全文检索

维度PostgreSQLMySQL
类型tsvector / tsquery列直接索引
索引GIN / GiST on tsvectorFULLTEXT
中文分词zhparser / pg_jiebangram
查询to_tsvector('zh',body) @@ to_tsquery('zh','关键词')MATCH(col) AGAINST('关键词')
高亮ts_headline 内置

18. 扩展生态

场景PostgreSQLMySQL 对标
地理 / GISPostGISMySQL Spatial
向量检索pgvector无官方(MariaDB 11.6+)
时序TimescaleDB
分布式分片CitusVitess
定时任务pg_cronEVENT SCHEDULER
分区管理pg_partman
统计扩展pg_stat_statements(必装)Performance Schema
外表 FDWpostgres_fdw / mysql_fdw / oracle_fdwFEDERATED(受限)
Web 接口PostgREST / pg_graphql
Oracle 兼容Orafce

19. 常用工具链

类别PostgreSQLMySQL
CLIpsqlmysql
图形客户端pgAdmin / DBeaver / DataGrip / NavicatWorkbench / DBeaver / Navicat
连接池PgBouncer / pgcat / OdysseyProxySQL / MaxScale
监控pg_stat_statements + postgres_exporter + Grafanamysqld_exporter / PMM
高可用Patroni / StolonMHA / Orchestrator / InnoDB Cluster
备份pgBackRest / Barman / wal-gxtrabackup / clone
在线改表pg_repackgh-ost / pt-osc
SQL 审核Archery / BytebaseArchery / Yearning / Bytebase

20. 选型建议

业务场景推荐理由
传统 OLTP(电商、CRM)均可看团队
复杂 SQL / 报表分析PG窗口函数 / CTE / 物化视图
JSONB / 数组 / 枚举 / 范围PG原生类型丰富
地理 / 地图PG + PostGIS碾压级优势
向量检索 / AI RAGPG + pgvectorMySQL 无官方
时序PG + TimescaleDB 或 专业 TSDB-
多租户 SaaSPGSchema 隔离 + RLS + 逻辑复制
极端写入 QPSMySQL线程 + 聚簇略占优
存储过程密集 / Oracle 迁移PGPL/pgSQL + Orafce
需要 DDL 事务PG所有 DDL 可回滚
团队只会 MySQLMySQL成本最低

一句话口诀

  • 业务后端 → 越发推荐 PG。
  • 数据分析 / 数仓边缘 → PG。
  • AI / 向量 / 地理 → PG 无悬念。
  • 老系统 / 人力有限 → 留 MySQL。

21. 常见误区 / 速查口诀

十大误区

  1. "PG 性能不如 MySQL" —— 通用 OLTP 差距极小,复杂场景 PG 更强。
  2. "PG 没有聚簇索引所以慢" —— PG 可用 CLUSTER 手工聚簇;且避免二级索引回表。
  3. "autovacuum 开着就行" —— 大写业务必须调 scale_factor / naptime / cost_limit
  4. "PG 连接开 5000 也没事" —— 超过 300 必须 PgBouncer。
  5. "RR 比 RC 更安全" —— PG 的 RC 已够用;强一致用 SERIALIZABLE(SSI)。
  6. "直接用 json 存" —— 永远用 jsonb
  7. "timestamp 就行" —— timestamptz
  8. "PG 不支持增量备份" —— pgBackRest / wal-g 早支持。
  9. "逻辑复制会复制 DDL" —— 不会,需手动双发。
  10. "只读长事务没关系" —— 照样阻止 VACUUM、推高 xid age。

速查口诀

进程 vs 线程:PG 进程 / MySQL 线程,PG 必配连接池。
多版本位置:PG 堆里 / MySQL Undo 里,PG 要 VACUUM。
默认隔离:PG = RC / MySQL = RR。
存储结构:PG 堆 + 索引分离 / MySQL 聚簇 + 二级索引。
UPSERT:PG `ON CONFLICT` / MySQL `ON DUPLICATE KEY`。
自增:PG `IDENTITY` / MySQL `AUTO_INCREMENT`。
RETURNING:PG 有 / MySQL 无。
JSONB + GIN + @>:PG 全家桶。
数组/范围/枚举/UUID/网络地址:PG 原生。
地理/向量/时序:PG 扩展三件套。
DDL 事务:PG 可回滚 / MySQL 不可。
长事务危险:PG 表膨胀 + xid 回卷 / MySQL Undo 炸裂。
SERIALIZABLE:PG 乐观 SSI / MySQL 悲观锁。
间隙锁:PG 无 / MySQL 有。
复制:PG 物理 + 逻辑 / MySQL binlog。
备份:PG pg_basebackup + pgBackRest / MySQL xtrabackup。
扩展:PG `CREATE EXTENSION` 一行搞定。

📌 一句话总结:PostgreSQL 是"功能大成的学院派",MySQL 是"运维优雅的互联网派"。遇到选型问题,按本附录场景表直接秒答。