

从架构、事务、性能、开发等层面详细对比了MySQL和PostgreSQL,帮助更快理解它们之间的共同点和不同点。
本文核心内容思维导图

架构方面
特性
| MySQL
| PostgreSQL
| 说明
|
可插拔式的引擎架构
| 支持
| 不支持
| MySQL:MyISAM, InnoDB, NDB, Brighthouse, Archive, Blackhole.PostgreSQL: 日志表和非日志表 |
几何数据库
| 支持
| 支持
| MySQLmyisam,innodbPostgreSQL完美支持。
|
| 继承表 | 不支持
| 支持
|
|
水平分区
| 支持
| 部分支持
| MySQL支持Range, List, Hash, Key 分区。PostgreSQL支持Range, List 分区。
|
数据库与模式
| 不支持
| 支持
| MySQL的模式即为数据库。PostgreSQL完整支持数据库和模式。
|
特性
| MySQL
| PostgreSQL
| 说明
|
| 二进制日志 | 支持
| 不支持
|
|
读水平扩展MySQLReplication
| 完美支持
| 支持
| MySQL从最初的版本就支持Replication.PostgreSQL从9.X 版本开始支持Replication.
|
写水平扩展MySQLCluster
| 支持 | 不支持
| MySQL支持对数据库写负载水平扩展。PostgreSQL暂时不支持。
|
| Memcached api for InnoDB/NDB | 支持
| 不支持
| PostgreSQL没有这种api。
|
特性
| MySQL
| PostgreSQL
| 说明
|
| HeapTable | 部分支持
| 支持 | PostgreSQL支持堆表。MySQL只有MyISAM引擎支持堆表。 |
Index OrganizedTable
| 支持
| 不支持
| 索引组织表在插入时位置是有序的。
|
事务方面
特性
| MySQL
| PostgreSQL
| 说明
|
事务
| DDL事务
| 不支持
| 支持 | MySQLDDL事务隐式提交
|
| 数据页大小可配置 | 支持 | 不支持 | MySQLInnoDB引擎支持4k,8k,16k,32k,64k等的页面大小设置;PostgreSQL数据页面大小8K
|
存储函数里面不能嵌套事务
| 支持
| 不支持
| MySQL支持在存储过程和存储函数里面进行事务处理。
|
性能方面
特性
| MySQL
| PostgreSQL
| 说明
|
索引
| 聚集索引 | 部分支持
| 支持
| MySQL仅InnoDB主键默认为聚集索引。PostgreSQL支持任意键为聚集索引。
|
部分索引
| 支持 | 不支持
| PostgreSQL不支持。
|
函数索引
| 支持 | 支持
| MySQL5.7支持
|
条件索引
| 不支持
| 支持 | where 条件过滤的索引。
|
位图索引
| 不支持
| 支持
| PostgreSQL支持Bitmap 索引。
|
特性
| MySQL
| PostgreSQL
| 说明
|
Force Index/Use Index
| 支持
| 不支持 | MySQL可以强制优化器来使用特定的索引。PostgreSQL只能强制优化器使用或者不使用任何索引。
|
| Join算法 | Hashjoin
| 不支持 | 支持 | MySQL只有普通的嵌套循环算法。PostgreSQL优化器内置了Hashjoin 与Merge Join。
|
Merge Join
| 不支持
| 支持
|
| Query Cache | 支持
| 不支持
| MySQL内置全局的查询缓存。 |
特性
| MySQL
| PostgreSQL
| 说明
|
物化视图
| 不支持
| 支持
| PostgreSQL从9.x开始支持物化视图
|
表空间
| 数据库空间
| 不支持
| 支持 | MySQL只有针对表的表空间,没有针对数据库的表空间。PostgreSQL有单独的数据库空间。
|
索引空间
| 不支持
| 支持
| MySQL的数据以及索引都是放在单独的文件里面。 |
临时表空间
| 支持 | 不支持
| MySQL有单独的临时表空间。PostgreSQL这方面欠缺
|
特性
| MySQL
| PostgreSQL
| 说明
|
Show global status /show status
| 支持
| 不支持 | MySQL通过此命令能查看数据库状态。PostgreSQL没提供这么多状态值。
|
| Full outer join | 不支持
| 支持
| MySQL可以用RIGHTJOIN 和LEFT JOIN合并来做。PostgreSQL原生支持。
|
递归查询
| 不支持
| 支持
| MySQL不支持递归查询。PostgreSQL支持用WITH 来做递归查询
|
特性
| MySQL
| PostgreSQL
| 说明
|
| 动态处理 | 存储过程
| 支持
| 不支持
| MySQL只有存储过程里面才能有动态处理语句。PostgreSQL没有存储过程这一说法。
|
存储函数
| 不支持
| 支持
| MySQL存储函数不支持动态处理语句。PostgreSQL有很强大的PLSQL。
|
触发器
| 不支持
| 支持 | MySQL触发器里不支持动态处理语句。PostgreSQL支持触发器函数。
|
延迟插入
| 支持
| 不支持
| MySQL在插入数据时,可以等待所有对这张表的查询结束后进行。
|
特性
| MySQL
| PostgreSQL
| 说明
|
触发器
| DDL触发器 | 不支持
| 支持
| MySQL不支持DDL触发器。PostgreSQL支持基于DDL的触发器
|
行触发器
| 支持
| 完美支持
| MySQL不能在触发器里面取消对表的更改。PostgreSQL可以在触发器里面取消对表的更改操作。 |
语句触发器
| 不支持
| 支持
| MySQL不支持。PostgreSQL支持基于基于语句的触发器。
|
规则
| 不支持
| 支持 | MySQL没有规则系统。PostgreSQL有一套完整的规则系统
|
开发方面
特性
| MySQL
| PostgreSQL
| 说明
|
| 函数参数默认值 | 不支持
| 支持
| MySQL必须显式调用 |
表字段函数默认值
|
| 完美支持
| MySQL只能把now()用作时间戳字段的默认值。PostgreSQL支持把任意函数作为字段默认值
|
字段立即约束/字段延迟约束
| 不支持
| 支持 | MySQL不支持字段级别的约束。PostgreSQL支持对任意字段设置完整性约束。
|
Windows 聚合函数
| 不支持
| 支持
| MySQL可以用C 的API来实现
|
特性
| MySQL
| PostgreSQL
| 说明
|
丰富的字段类型
| 数组类型 | 不支持
| 支持 | MySQL没有规则系统。PostgreSQL有一套完整的规则系统。
|
记录类型
| 不支持 | 支持 | MySQL只支持返回某个字段值。PostgreSQL支持PLSQL返回一行记录
|
表类型
| 不支持 | 支持 | PostgreSQL支持PLSQL返回一张表数据。
|
网络类型
| 不支持 | 支持 | PostgreSQL提供了内置的IPV4,IPV6,MAC地址等网络类型。
|
范围类型
| 不支持 | 支持 | PostgreSQL支持基本类型的范围,比如时间范围:[2010-01-01 14:30, 2010-01-01 15:30)
|
自定义类型
| 不支持 | 支持 | PostgreSQL支持用户自定义复杂数据类型。
|
特性
| MySQL
| PostgreSQL
| 说明
|
表函数
| 不支持
| 支持 | PostgreSQL可以把函数当成表来对待
|
Json类型
| 支持 | 支持 | MySQL5.7支持
|
原生PLSQL调试工具
| 不支持
| 支持 | PostgreSQL有免费的存储过程调试工具,比如pgadmin-II。
|
Session 变量
| 支持
| 不支持
| MySQL支持SESSION域的变量。
|
特性
| MySQL
| PostgreSQL
| 说明
|
用于更新的limit
| 支持
| 不支持
| MySQL支持对表数据进行更新的LIMIT
|
Insert ignore
| 支持
| 不支持
| 忽略已经存在的主键记录
|
Merge into
| 部分支持
| 不支持
| MySQL有基于主键的判断策略,如果主键记录存在,那么可以更新。
|
Replace
| 支持
| 不支持
| MySQL有基于主键的判断策略,如果主键记录存在,那么删除对应的记录,再插入新的记录。
|
Do
| 不支持
| 支持 | PostgreSQL支持用do语句在命令行执行一段PLSQL。
|
Reindex
| 不支持
| 支持
| PostgreSQL支持重建索引。MySQL只能手工来做
|
其他
特性
| MySQL
| PostgreSQL
| 说明
|
角色
| 不支持
| 支持
| MySQL只有用户的概念。PostgreSQL提供完整的角色以及用户。 |
序列
| 不支持 | 支持 | PostgreSQL提供完整的序列对象以及对应的操作函数。
|
dblink
| 不支持 | 支持 | PostgreSQL提供了DBLINK插件来访问不同实例或者不同的数据库。
|
数据库改名
| 不支持 | 支持 | PostgreSQL提供了简单的数据库改名方法。
|
用第三方语言来写PLSQL
| 不支持 | 支持 | MySQL必须重新编译源码来实现。PostgreSQL内置了N多接口。 |