Fork me on GitHub

MySQL VS PgSQL

   MySQL与PostgreSQL都是免费、开源、强大、且功能丰富的数据库。在项目数据库选择时主要的问题可能是:哪一个才是最好、最合乎业务的开源数据库,MySQL还是PostgreSQL呢?该选择哪一个开源数据库呢?毕竟项目初期数据库选定,后序想变更成本比较高。

   对比之前,先从各自的官网悄咪咪的偷两张图

MySQL

  MySQL诞生于1994年(哈哈哈,就比我大一岁)。官网声称自己是最流行的开源数据库。MySQL的设计目标是成为一个快速的Web服务器后端,使用快速的索引序列访问方法(ISAM),最初是不支持ACID的。经过早期快速的发展,MySQL开始支持更多的存储引擎,并通过InnoDB引擎实现了ACID。MySQL还支持其他存储引擎,提供了临时表的功能(使用MEMORY存储引擎),通过MyISAM引擎实现了高速读的数据库,此外还有其他的核心存储引擎与第三方引擎:MySQL从2007年开始提供了插件式的存储引擎API,从此涌出了一系列为不同目的而设计的存储引擎,如OLTP类引擎、面向列的存储引擎等。

  MySQL近几年经历了所有权的变更和一些颇具戏剧性的事件。它最初是由MySQL AB开发的,2008年MySQL被SUN公司收购,2009年,Oracle收购SUN,至此MySQL成为Oracle旗下产品,其核心代码基于GPL许可,大部分版本仍旧保持开源、免费。注:Oracle支持MySQL的多个版本:Standard、Enterprise、Classic、Cluster、Embedded与Community。

 

  MySQL的文档非常丰富,有很多质量不错的免费参考手册、图书与在线文档,还有来自于Oracle和第三方厂商的培训与支持。

 

  现在,基于最初的MySQL代码还有更多的数据库可供选择,因为几个核心的MySQL开发者已经发布了MySQL分支。最初的MySQL创建者之一 Michael “Monty” Widenius貌似后悔将MySQL卖给了Sun公司,于是又开发了他自己的MySQL分支MariaDB,它是免费的,基于GPL许可。知名的 MySQL开发者Brian Aker所创建的分支Drizzle对其进行了大量的改写,特别针对多CPU、云、网络应用与高并发进行了优化。

PostgreSQL

  PostgreSQL官方标榜自己是世界上最先进的开源数据库。甚至有网友说它能与Oracle相媲美,但PgSQL开源啊,社区有很成熟、活跃。它拥有很长的历史,最初是1985年在加利福尼亚大学伯克利分校开发的,作为Ingres数据库的后继。

  PostgreSQL是完全由社区驱动的开源项目,由全世界超过1000名贡献者所维护。它提供了单个完整功能的版本,而不像MySQL那样提供了多个不同的版本,例如:社区版、商业版与企业版。PostgreSQL基于自由的BSD/MIT许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声明即可。

  可靠性是PostgreSQL的最高优先级。它以坚如磐石的品质和良好的工程化而闻名,支持高事务、任务关键型应用。PostgreSQL的文档非常精良,提供了大量免费的在线手册,还针对旧版本提供了归档的参考手册。PostgreSQL的社区支持是非常棒的,还有来自于独立厂商的商业支持。

  数据一致性与完整性也是PostgreSQL的高优先级特性。PostgreSQL是完全支持ACID特性的,它对于数据库访问提供了强大的安全性保证,充分利用了企业安全工具,如Kerberos与OpenSSL等。你可以定义自己的检查,根据自己的业务规则确保数据质量。在众多的管理特性中,point-in-time recovery(PITR)是非常棒的特性,这是个灵活的高可用特性,提供了诸如针对失败恢复创建热备份以及快照与恢复的能力。但这并不是 PostgreSQL的全部,项目还提供了几个方法来管理PostgreSQL以实现高可用、负载均衡与复制等,这样你就可以使用适合自己特定需求的功能了。

关于GPL许可和BSD/MIT许可的解释:一图秒懂开源许可证协议-GPL、BSD、MIT、Mozilla、Apache,LGPL

 

 

                图片引自上文原创博客

 

 

PgSQL相对于MySQL的优势

1、在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨;

2、存储过程的功能支持要比MySQL好,具备本地缓存执行计划的能力;

3、对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强;

4、PgSQL主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。

5、PgSQL的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。

6、MySQL的存储引擎插件化机制,存在锁机制复杂影响并发的问题,而PgSQL不存在。

MySQL相对于PgSQL的优势

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

2、MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束;

3、MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作;

4、MySQL分区表的实现要优于PG的基于继承表的分区实现,主要体现在分区个数达到上千上万后的处理性能差异较大。

5、MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。

 

上面是从概念等大的层面进行对比,接下来结合实际开发说说。

1、MySQL 的各种 text 字段有不同的限制, 要手动区分 small text, middle text, large text等,PgSQL 没有这个限制, text 能支持各种大小.

 

 

 

2、PgSQL按照 SQL 标准, 做 null 判断不能用 = null, 只能用 is nul。同时官方也提供了配置 transform_null_equals,可以将=null 转换成is null。

3、MySQL要存表情😊,必须使用utf8mb4格式,PgSQL则没有这个问题。关于MySQL为什么会这么做,给个传送门自己看去。

4、MySQL默认隔离级别为Repeatable read(可重复读),PgSQL默隔离级别是Read committed(提交读)。

  repeatable read 并不能阻止常见的并发更新, 得加锁才可以, 但悲观锁会影响性能, 手动实现乐观锁又复杂.
  而 PgSQL 的列里有隐藏的乐观锁 version 字段, 默认的 repeatable read 级别就能保证并发更新的正确性, 并且又有乐观锁的性能。
  mybatis-plus结合PgSQL开启乐观锁(插件)也很简单。

 5、MySQL 不支持多个表从同一个序列中取 id, 而 Pg 可以。比如下面定义的t_element_type_id是t_element_type表的,t_test也可以用这个主键生成策略。

5、PgSQL 窗口函数支持over()子句,能简单的解决 "每组取 top 10"、"动态数据累加" 的这类问题。MySQL不知有没有这些高级功能,欢迎评论。

6、PgSQL可以存储 array 和 json, 可以在 array 和 json 上建索引, 甚至还能用表达式搜索。为了实现文档数据库的功能, 设计了 jsonb 的存储结构.MySQL虽然也支持JSON格式数据,但是功能和效率仍不如PgSQL。https://www.modb.pro/db/73169

  有人会说为什么不用 Mongodb 的 BSON 呢? Pg 的开发团队曾经考虑过, 但是当他们发现BSON 把 ["a", "b", "c"] 存成 {0: "a", 1: "b", 2: "c"} 的时候就决定要重新做一个 jsonb 了,据网上大佬测试现在 jsonb 的性能已经优于 BSON。了解更多操作详见JSON Functions and Operators

7、PgSQL支持许许多多的数据组件(功能):缓存,OLTP,OLAP/批处理/数据仓库,流处理/消息队列,搜索索引,NoSQL/文档数据库,地理数据库,空间数据库,时序数据库,图数据库。

  • OLTP(联机事务处理):事务处理目前关系性数据库都具备的,PgSQL肯定不在话下。
  • OLAP(联机分析处理):citus分布式插件,ANSI SQL(国际数据库标准)兼容,窗口函数,CTE,CUBE等高级分析功能
  • 流处理:PipelineDB扩展,Notify-Listen,物化视图,规则系统,灵活的存储过程与函数编写。CREATE FUNCTOIN...
  • 时序数据:timescaledb时序数据库插件,分区表,BRIN索引。timescaledb扩展虽然比不上专用时序数据库,但百万记录每秒的入库速率还是有的。CREATE EXTENSION IF NOT EXISTS timescaledb;
  • 空间数据:PostGIS扩展(杀手锏),内建的几何类型支持,GiST索引。这也是为什么很多游戏项目使用PgSQL
  • 搜索索引:全文搜索索引足以应对简单场景;丰富的索引类型,支持函数索引,条件索引 .PgSQL全文索引介绍
  • 非关系型数据(NoSQL):JSON,JSONB,XML,HStore原生支持。

8、因PgSQL使用了MVCC,数据库需要定期VACUUM,有额外的维护工作。但是官方也给出了很多VACUUM配置:详见:postgresql.conf

9、PgSQL开启慢查询日志记录比较繁琐。见:postgresql开启慢查询日志  mysql开启慢查询日志

10、在高并发读写,负载逼近极限下,PgSQL的性能指标仍可以维持双曲线甚至对数曲线,到顶峰之后不再下降,而 MySQL 明显出现一个波峰后下滑.

12、对于文件复制,MySQL到现在也是异步复制,PgSQL可以做到同步,异步,半同步复制。

13、mysql的同步是基于binlog复制,类似oracle golden gate,是基于stream的复制,做到同步很困难,这种方式更加适合异地复制,pgsql的复制基于wal,可以做到同步复制。同时,pgsql还提供stream复制。

14、PgSQL还有一个很NX的功能:FDW (被吹的很很强,原谅我没用过,等我使用后再来介绍吧...)

总结

开源数据库都不是很完善,商业数据库oracle在架构和功能方面都还是完善很多的。从应用场景来说,PG更加适合严格的企业应用场景(比如金融、电信、ERP、CRM、物联网),而MySQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google、facebook、alibaba)。

posted @ 2022-08-31 15:41  JackpotHan  阅读(1233)  评论(0编辑  收藏  举报