PostgreSQL与MySQL:一场深度比较与选择指南

发表时间: 2023-06-14 16:45

为了弄明白PostgreSQL和MySQL的差别,我搜索了关键字:MySQL vs PostgreSQL,并看了第一页的几个文章。以下是简单总结:

比较版本:PostgreSQL 11 VS MySQL5.7(innodb引擎)


搜索量

首先根据百度搜索量可以看出,近一年内MySQL的平均搜索量是pg的4倍多,给人的第一感觉就是MySQL的使用量更高一点

搜索量

协议

协议上,pg的协议更加宽容,不要求基于pg开发的软件也必须开源,MySQL的GPL协议要求使用它开发的软件也必须开源,否则就需要付费。虽然这看起来PG对各类型的用户都更友好,但这一点也是缺点,由于使用PG可以不开源,所以如果基于pg开发的软件最后都闭环发展,就会导致好的技术不会吸收到主干道上,而MySQL就没有这一弊端,长远来看,MySQL的生命力就会越来越强。

版本分支

  1. PGSQL只有社区版,没有其他任何分支版本,PGSQL官方统一开发,统一维护,社区版有所有功能,不像SQL Server和MySQL有标准版、企业版、经典版、社区版、开发版、web版之分国内外还有一些基于PGSQL做二次开发的数据库厂商,例如:Enterprise DB、瀚高数据库等等,当然这些只是二次开发并不算独立分支
  2. MySQL由于历史原因,分裂为三个分支版本,MariaDB分支、Percona分支 、Oracle官方分支,发展到目前为止各个分支基本互相不兼容Oracle官方分支还有版本之分,分为标准版、企业版、经典版、社区版

安装方式

  1. PGSQL有各个平台的包rpm包,deb包等等,相比MySQL缺少了二进制包,一般用源码编译安装,安装时间会长一些,执行命令多一些
  2. MySQL有各个平台的包rpm包,deb包等等,源码编译安装、二进制包安装,一般用二进制包安装,方便快捷

架构

  1. MySQL是多线程。虽然多线程架构,但是官方有限制连接数,原因是系统的并发度是有限的,线程数太多,反而系统的处理能力下降,随着连接数上升,反而性能下降一般同时只能处理200 ~300个数据库连接
  2. PG是多进程。并发连接数不能太多,跟Oracle一样,既然跟Oracle一样,那么很多优化方法也是相通的,例如:开启大页内存
  3. 多线程架构和多进程架构之间没有绝对的好坏,例如oracle在unix上是多进程架构,在windows上是多线程架构。

对存储过程及事务的支持能力

  1. MySQL对于无事务的MyISAM表,采用表锁定,一个长时间运行的查询很可能会长时间地阻碍对表的更新,而PostgreSQL不存在这样的问题。
  2. PostgreSQL支持存储过程,要比MySQL好,具备本地缓存执行计划的能力;
  3. MySQL 4.0.2-alpha开始支持事务的概念,保留无事务的表类型, 为用户提供了更多的选择。

稳定性及性能

  1. 高并发读写,负载逼近极限下,PG的性能指标高于mysql
  2. mysql的innodb引擎可以优化利用系统所有内存,超大内存下PG对内存的使用不那么充分。
  3. PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃、断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统库是MyISAM的,相比之下,PG数据库这方面要好一些。

数据同步方式

  1. mysql到现在也是异步复制,pgsql可以做到同步,异步,半同步复制。
  2. mysql的同步是基于binlog复制,类似oracle golden gate,是基于stream的复制,做到同步很困难,这种方式更加适合异地复制;pgsql的复制基于wal,可以做到同步复制。同时,pgsql还提供stream复制。
  3. MySQL的复制可以用多级从库,但是在9.2之前,PGSQL不能用从库带从库。
  4. PG的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。

对SQL语句的支持

  1. PG在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨;
  2. PG对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强
  3. MySQL的Join操作的性能非常的差,只支持Nest Join,所以一旦数据量大,性能就非常的差。PostgreSQL除了支持nest join外,还支持hash join和 sort merge join;PostgreSQL支持正则表达式查找,MySQL不支持

数据类型方面

  1. PGSQL数据类型丰富,如 ltree,hstore,数组类型,ip类型,text类型,有了text类型不再需要varchar,text类型字段最大存储1GB
  2. MySQL数据类型不够丰富

索引类型

  1. PGSQL多种索引类型(btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表达式索引)
  2. MySQLbtree 索引,全文索引(低效),表达式索引(需要建虚拟列),hash 索引只在内存表

主从复制安全性

  1. PGSQL同步流复制、强同步(remote apply)、高安全,不会丢数据PGSQL同步流复制:所有从库宕机,主库会罢工,主库无法自动切换为异步流复制(异步模式),需要通过增加从库数量来解决,一般生产环境至少有两个从库手动解决:在PG主库修改参数synchronous_standby_names ='',并执行命令:pgctl reload ,把主库切换为异步模式主从数据完全一致是高可用切换的第一前提,所以PGSQL选择主库罢工也是可以理解。
  2. MySQL增强半同步复制 ,mysql5.7版本增强半同步才能保证主从复制时候不丢数据mysql5.7半同步复制相关参数:参数rpl_semi_sync_master_wait_for_slave_count 等待至少多少个从库接收到binlog,主库才提交事务,一般设置为1,性能最高参数rpl_semi_sync_master_timeout 等待多少毫秒,从库无回应自动切换为异步模式,一般设置为无限大,不让主库自动切换为异步模式所有从库宕机,主库会罢工,因为无法收到任何从库的应答包手动解决:在MySQL主库修改参数rpl_semi_sync_master_wait_for_slave_count=0

备份恢复

  1. PGSQL备份恢复非常简单,时点恢复操作比SQL Server还要简单,完整备份+wal归档备份(增量)假如有一个三节点的PGSQL主从集群,可以随便在其中一个节点做完整备份和wal归档备份
  2. MySQL备份恢复相对不太简单,完整备份+binlog备份(增量)完整备份需要percona的XtraBackup工具做物理备份,MySQL本身不支持物理备份时点恢复操作步骤繁琐复杂。

插件功能

  1. PGSQL支持插件功能,可以丰富PGSQL的功能,GIS地理插件,时序数据库插件, 向量化执行插件等等
  2. MySQL不支持插件功能

总结

PG和MySQL的区别仍然还有很多没有列出,简单点总结,pg更重视功能,扩展性强,可闭环发展,所以在政府、金融、银行用的比较多。MySQL重在速度,速度高于pg,使用更加简单便捷,所以它在互联网上使用的比较多,建议在选择这两种数据库时,考虑不要只停留在数据库层面,还需要考虑到团队的技术栈、应用的规模和复杂性、预期的用户负载等。