数据库对比 | MySQL vs PostgreSQL

Posted 数据与人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库对比 | MySQL vs PostgreSQL相关的知识,希望对你有一定的参考价值。

上次做了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.PostgreSQL9.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
说明
索引

聚集索引

部分支持
支持
MySQLInnoDB主键默认为聚集索引。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
说明
物化视图
不支持
支持
PostgreSQL9.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提供了内置的IPV4IPV6MAC地址等网络类型。
范围类型
不支持 支持 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多接口。




推荐文章 · 点击阅读






以上是关于数据库对比 | MySQL vs PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

数据库基础选型之——PostgreSQL vs MySQL分析对比

SAS vs SSD对比测试MySQL tpch性能

MySQL8和PostgreSQL10功能对比

MongoDB vs MySQL,哪个效率更高?

MongoDB vs MySQL,哪个效率更高?

WordPress VS ModStart 框架的对比