上次做了MySQL vs Oracle的对比。
今天继续对比MySQL vs PostgreSQL。
PS:本文手机浏览方式不太友好,有条件请使用电脑浏览。
言归正传。
笔者从架构、事务、性能、开发等层面详细对比了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多接口。 |
推荐文章 · 点击阅读
文章转载自数据与人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。