数据库对比 | 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.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多接口。 |
推荐文章 · 点击阅读
以上是关于数据库对比 | MySQL vs PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章