PostgreSQL和MySQL应该如何选择

Posted youzhouliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL和MySQL应该如何选择相关的知识,希望对你有一定的参考价值。

前话

最近看了一篇文章,说炙手可热的 PostgreSQL 已成大厂首选。

大意如下:

随着企业在云上对其数据库资产进行现代化改造,许多企业都在积极消除对传统数据库引擎的依赖。企业客户都在寻找标准化的开放系统如 PostgreSQL,以消除昂贵的、不友好的许可以及与传统数据库产品的供应商锁定。

根据 DB-Engines 的数据,PostgreSQL 的受欢迎程度一直在稳步提升,目前在所有数据库中排名第四。随着 PostgreSQL 在数据库中越来越受欢迎,谷歌云、AWS、微软云也都开始将重点慢慢转向 PostgreSQL。

对此,笔者查阅了一些资料,做了一些参考和整理后,从如下一些点进行了对比:

特性PostgreSQLmysql
开源PostgreSQL是一个免费的开源系统,它受PostgreSQL许可证(自由的开源许可证)的约束。MySQL属于Oracle旗下产品,并提供几种付费版本供用户使用
管理PostgreSQL是全球用户共同发展的产品MySQL是GNU通用公共许可以及各种专有协议条款下的产品
性能PostgreSQL适合对读写速度要求很高的大型系统中使用MySQL主要用于Web应用程序,该Web应用程序仅需要数据库来进行数据交易。
遵循ACIDPostgreSQL从头到尾都遵循ACID原则,并确保满足需求MySQL只有在使用InnoDB和NDB集群存储引擎时才符合ACID要求。
SQL 兼容性“从文档看,PostgreSQL是兼容大部分SQL的。 PostgreSQL支持SQL:2011的大多数功能。在核心一致性所需的179个强制性功能中,PostgreSQL至少兼容160个。此外,还有一系列受支持的可选功能。”“从文档看,MySQL在某些版本是兼容部分SQL。 我们对该产品的主要目标之一是继续努力达到SQL标准的要求,但又不牺牲速度或可靠性。我们可以添加SQL扩展或对非SQL功能的支持,如果这样可以极大地提高MySQL服务器在我们大部分用户群中的可用性。”
支持平台PostgreSQL可以运行在Linux, Windows (Win2000 SP4 及以上),FreeBSD,OpenBSD,NetBSD , Mac OS X, AIX, IRIX ,Solaris和 Tu64. 也支持由技术巨头惠普开发的HP-UX OS,以及开源的Unix OS。MySQL可以运行在Oracle Solaris,Microsoft Windows, Linux Mac OS X。MySQL扩展了对开源FreeBSD OS的支持
编程语言支持PostgreSQL是用C语言编写的,它支持多种编程语言,最突出的C/C++, Delphi, javascript, Java, Python, R , Tcl , Go, Lisp, Erlang和.Net.等。MySQL是用C++编写的,它支持C/C++, Erlang,php,Lisp,和Go, Perl,Java, Delphi, R ,和 Node.js.等。
物化视图PostgreSQL支持物化视图MySQL不支持物化视图
数据备份PostgreSQL支持主备复制,并且还可以通过实现第三方扩展来处理其他类型的复制MySQL支持主备复制,其中每个节点都是主节点,并且有权更新数据
可拓展性PostgreSQL是高度可扩展的,您可以添加和拥有数据类型,运算符,索引类型和功能语言。MySQL不支持拓展性。
访问方法PostgreSQL支持所有标准。MySQL支持所有标准。
社区支持PostgreSQL有一个活跃的社区支持,该社区帮助改善现有功能,其富有创造力的提交者竭尽全力确保该数据库保持最新的功能和最大的安全性,成为最先进的数据库。MySQL也有一个庞大的追随者社区,这些社区贡献者,特别是在被Oracle收购之后,主要关注一些偶尔出现的新功能,并维护现有功能。
安全性PostgreSQL为连接提供本机SSL支持,以加密客户端/服务器通信。 PSQL还具有行级安全性。MySQL是高度安全的,并且包含多个安全功能。

各个特性详细介绍如下:

一、开源

开源协议:PostgreSQL 基于自由的 BSD/MIT 许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声明即可。

PG 的开源协议特别灵活,任何公司的和个人都可以把PG作为一个产品销售,而不需要像 MySQL那样必须修改大部分代码才可以作为公司的产品。

MySQL 的开源协议是基于 GPL 协议,任何公司都可以免费使用,不允许修改后和衍生的代码做为闭源的商业软件发布和销售,MySQL 的版权在甲骨文手中,甲骨文可以推了其商业闭源版本。

二、ACID支持方面

PostgreSQL 支持事务的强一致性,事务保证性好,完全支持 ACID 特性。

MySQL 只有 InnoDB 引擎支持事务,事务一致性保证上可根据实际需求调整,为了最大限度的保护数据,MySQL 可配置双一模式,对 ACID 的支持上比 PG 稍弱。

三、SQL标准的支持方面

PostgreSQL 几乎支持所有的 SQL 标准,支持类型相当丰富。

MySQL 只支持部分 SQL 标准,相比于 PG 支持类型稍弱。

四、复制

PostgreSQL 可以做到同步,异步,半同步复制,以及基于日志逻辑复制,可以实现表级别的订阅和发布。

MySQL 的复制是基于 binlog 的逻辑异步复制,无法实现同步复制。

MySQL 所有的高可用方案都是基于 binlog 做的同步,以及基于 MySQL 的分布式数据也是基于MySQL 的 binlog 实现,binlog 是 MySQL 生态圈最基本技术实现。

五、并发控制

PostgreSQL 通过其 MVCC 实现有效地解决了并发问题,从而实现了非常高的并发性。

PG新老数据一起存放的基于 XID 的 MVCC 机制,新老数据一起存放,需要定时触发 VACUUM,会带来多余的 IO 和数据库对象加锁开销,引起数据库整体的并发能力下降。而且 VACUUM 清理不及时,还可能会引发数据膨胀。

MySQL仅在 InnoDB 中支持 MVCC。

InnoDB 的基于回滚段实现的 MVCC 机制,但是 MySQL 的间隙锁影响较大,锁定数据较多。

六、性能

PostgreSQL 广泛用于读写速度高和数据一致性高的大型系统。此外,它还支持各种性能优化,没有读锁定的并发性。

PostgreSQL 性能最适用于需要执行复杂查询的系统。

PostgreSQL 在 OLTP/OLAP 系统中表现良好,读写速度以及大数据分析方面表现良好,基于 PG 的 GP 数据库,在数据仓库领域表现良好。

PostgreSQL 也适用于商业智能应用程序,但更适合需要快速读/写速度的数据仓库和数据分析应用程序。

MySQL 是广泛选择的基于 Web 的项目,需要数据库只是为了简单的数据事务。但是,当遇到重负载或尝试完成复杂查询时,MySQL 通常会表现不佳。

MySQL 的读取速度,在 OLTP 系统中表现良好。

MySQL + InnoDB 为 OLTP 场景提供了非常好的读/写速度。总体而言,MySQL 在高并发场景下表现良好。

MySQL 是可靠的,并且与商业智能应用程序配合良好,因为商业智能应用程序通常读取很多。

七、高可用技术的实现

PostgreSQL:

1)基于流复制的异步、同步主从。

2)基于流复制的–keepalive。

3)基于流复制的 –repmgr。

4)基于流复制的 –patroni+etcd。

5)共享存储HA(corosync+pacemaker)。

6)Postgres-XC。

7)Postgres-XL。

8)中间件实现:pgpool、pgcluster、slony、plploxy。

MySQL:

1)主从复制。

2)主主复。

3)MHA。

4)LVS+KEEPALIVE。

5)MGR分布式数据库,多点写入[不建议],基于paxos协议。

6)PXC分布式数据库,多点写入[不建议],基于令牌环协议。

7)INNODB CLUSTER[8.0新技术,基于MGR实现,上层封装命令],基于paxos协议。

8)中间件实现:mycat。

八、外部数据源

PostgreSQL 不支持多数据引擎。但支持 Extension 组件扩充,以及通过名为 FDW 的技术将Oracle、Hadoop、MongoDB、SQLServer、Excel、CSV 文件等作为外部表进行读写操作,因此,可以为大数据与关系型数据库提供良好对接。

MySQL:无。

九、数据存储和数据类型

PG 主表采用堆表存放,存放的数据量较大,数据访问方式类似于 Oracle 的堆表。

MySQL 采用索引组织表,MySQL 必须有主键索引,所有的数据访问都是通过主键实现,二级索引访问时,需要扫描两遍索引(主键和二级索引)。

以上是关于PostgreSQL和MySQL应该如何选择的主要内容,如果未能解决你的问题,请参考以下文章

除了mysql 和 sql server, 你还有另外一种选择 postgreSQL

从 MySQL 迁移到 PostgreSQL 时,Django 用户应该知道啥?

PostgreSQL贡献者指引

PostgreSQL贡献者指引

为什么选择PostgreSQL而不是MySQL

PgSQL主要贡献者对PostgreSQL内置分片功能的看法