本文介绍了MySQL和PostgreSQL的一些特性对比,让大家了解两者的优缺点,做出更好的选择。图片来自Pexels目前国内情况。互联网公司用MySQL比较多,但是PostgreSQL用的不多。不过相信看到PG的新特性后,你一定会爱上她的。当然,MySQL作为最流行的数据库,依然会吸引大多数人的眼球。PostgreSQL标榜自己是世界上最先进的开源数据库,甚至PG的fans或者一些PGER都声称她可以和Oracle相提并论(PG虽然很强大,但是和Oracle还是有差距的,当然优势在于PG很明显),也没有那么贵的价格和傲慢的客服。当然,PG完整而强大的功能首先从9版本开始,到10版本迅速发展,增加了很多功能和特性。PostgreSQL是一个完全由社区驱动的开源项目。其核心代码由社区维护,商业版基于PG二次开发。MySQL号称是最流行的开源数据库。纵观目前国内的情况,也是名副其实的。几经出售,MySQL最终落入甲骨文公司手中。正是出于这个原因,MySQL之父Monty修改了MySQL的源代码,创建了MariaDB分支。说到这里,当然不得不提另一个重要的分支,Percana公司的PerconaServer。Percona比较擅长MySQL运维,开发了很多非常实用的运维工具,已经开源回馈社区,比如XtraBackup、pt-Toolkits工具。简单对比一下MySQL和PostgreSQL就可以看出,MySQL的背后是一个成熟的商业公司(Oracle有自己的MySQL企业版,收费,有很多社区版没有的特性),而PostgreSQL的背后是一个庞大的志愿者开发组。相比较而言,PostgreSQL在本质上没有那么商业化。它没有所谓的PostgreSQL企业版,但是有一些基于PG开发的企业级PG数据库。下面我将从以下几个方面来说明MySQL和PostgreSQL的异同和优缺点。由于作者水平所限,还请多多指教。1.开源PostgreSQL:世界上最先进的开源数据库。开源协议:PostgreSQL基于免费的BSD/MIT许可证。组织可以使用、复制、修改和重新分发代码,只要提供版权声明即可。PG的开源协议特别灵活,任何公司或个人都可以将PG作为产品出售,而不必像MySQL那样修改大部分代码就可以作为公司产品使用。MySQL:世界上最受欢迎的开源数据库。开源协议:核心代码基于GPL或CommercialLicense。MySQL的开源协议基于GPL协议,任何公司都可以免费使用。修改和派生代码不得作为闭源商业软件发布和销售。MySQL的版权在甲骨文手中,甲骨文可以推广其商业闭源软件。版本。如上图所示,在开源软件协议2.ACID支持方面,PostgreSQL支持事务一致性强,事务保证好,全面支持ACID特性。MySQL只支持innodb引擎的事务,事务一致性保证可以根据实际需要进行调整。为了最大限度的保护数据,MySQL可以配置双模式,对ACID的支持比PG略弱。3、在对SQL标准的支持方面,PostgreSQL几乎支持所有的SQL标准,支持的类型也相当丰富。MySQL只支持部分SQL标准,比PG支持的要弱。4、复制MySQL的复制是基于binlog的逻辑异步复制,无法实现同步复制。复制方式:一主一备、一主多备、级联复制、循环复制、主-主复制数据传输优势:通过Canal增量数据的订阅和消费,可以同步数据到Kafka,数据传输可以通过Kafka完成。所有的MySQL高可用解决方案都是基于binlog的同步,基于MySQL的分布式数据也是基于MySQL的binlog实现。Binlog是MySQL生态最基础的技术实现。PostgreSQL可以实现同步、异步、半同步复制和基于日志的逻辑复制,可以实现表级的订阅和发布。复制方式:一主一备,一主多备,级联复制,热备库/流复制,逻辑复制数据流优势:通过逻辑复制实现消息的订阅和消费,数据同步到Kafka,数据流可以通过Kafka实现。5.并发控制PostgreSQL通过其MVCC实现有效地解决了并发问题,从而实现了非常高的并发。PG基于XID-basedMVCC机制将新旧数据存储在一起。新旧数据存储在一起,需要定时触发VACUUM,会带来冗余IO和数据库对象加锁开销,导致数据库整体并发能力下降。而且,如果不及时清理VACUUM,还可能造成数据膨胀。当然,PostgreSQL对比较也有一点影响。为了保证事务的强一致性,挂起的事务会影响所有表的VACUUM清理,导致表膨胀。MySQL仅支持InnoDB中的MVCC。InnoDB的MVCC机制是基于回滚段的,但是MySQL的间隙锁影响更大,锁住的数据更多。6、性能PostgreSQL①PostgreSQL广泛应用于读写速度快、数据一致性高的大型系统中。此外,它还支持各种性能优化,这当然只有在商业解决方案中才有,例如地理空间数据支持、无读锁并发等。②PostgreSQL性能最适合需要执行复杂查询的系统。③PostgreSQL在OLTP/OLAP系统中表现出色,在读写速度和大数据分析方面表现出色。基于PG的GP数据库在数据仓库领域表现良好。④PostgreSQL也适用于商业智能应用,但更适用于需要快速读写速度的数据仓库和数据分析应用。MySQL①MySQL是一个被广泛选择的基于网络的项目,它只需要一个数据库来进行简单的数据交易。但是,MySQL在负载很重或试图完成复杂查询时通常表现不佳。②MySQL的读取速度在OLTP系统中表现良好。③MySQL+InnoDB为OLTP场景提供了非常好的读写速度。总体来说,MySQL在高并发场景下表现不错。④MySQL是可靠的,并且与商业智能应用程序配合得很好,因为商业智能应用程序通常读取很多。7.PostgreSQL高可用技术的实现①基于流复制的异步和同步主从。②基于流复制的Keepalive。③基于流复制的Repmgr。④基于流复制的Patroni+etcd。⑤共享存储HA(corosync+pacemaker)。⑥Postgres-XC。⑦Postgres-XL。⑧中间件实现:pgpool、pgcluster、slony、plploxy。MySQL①主从复制。②师父。③MHA。④LVS+保活。⑤MGR分布式数据库,多点写入【不推荐】,基于Paxos协议。⑥PXC分布式数据库,多点写入【不推荐】,基于令牌环协议。⑦INNODBCLUSTER【8.0新技术,基于MGR实现,上层封装命令】,基于Paxos协议。⑧中间件实现:Mycat。8、外部数据源PostgreSQLFDW:[foreign-datawrapper的缩写,可称为外部包装。PostgreSQL不支持多数据引擎。但是它支持Extension组件扩展,通过一种叫做FDW的技术将Oracle、Hadoop、MongoDB、SQLServer、Excel、CSV文件等作为外部表进行读写。因此,它可以很好地连接大数据和关系数据库。MySQL:无。9、数据存储和数据类型PG主表存储在堆表中,存储大量数据,数据访问方式类似于Oracle的堆表。MySQL使用索引组织表。MySQL必须有一个主键索引。所有的数据访问都是通过主键实现的。访问二级索引时,需要对索引进行两次扫描(主键和二级索引)。10、PostgreSQL和MySQL的优劣比较PostgreSQL相对于MySQL的优势①SQL的标准实现比MySQL更完整,功能实现更严谨。②存储过程的功能支持优于MySQL,具有在本地缓存执行计划的能力。③完全支持表连接,优化器功能完备,支持的索引类型多,复杂查询能力强。④PG主表存储在堆表中,MySQL采用索引组织表,可以支持比MySQL更大的数据量。⑤PG的主从复制是物理复制。与MySQL基于binlog的逻辑复制相比,数据一致性更可靠,??复制性能更高,对主机性能影响更小。⑥MySQL的存储引擎插件机制存在锁机制复杂影响并发的问题,但PG不存在。⑦PG对可以实现外部数据源查询,数据源支持类型丰富。⑧PG原生的逻辑复制可以实现表级的订阅和发布,无需其他组件即可实现数据通过Kafka流转。⑨PG支持嵌套循环、散列连接、排序合并三种表连接方式,而MySQL只支持嵌套循环。⑩PostgreSQL源码写的很清楚,可读性比MySQL强很多。?PostgreSQL通过PostGIS扩展支持地理空间数据。地理空间数据具有直接在数据库级别可用的专用类型和函数,使开发人员的分析和编码更加容易。?可扩展系统,具有丰富的可扩展组件,发布为Contribute。?PostgreSQL支持JSON和其他NoSQL特性,例如原生XML支持和使用HSTORE的键值对。它还支持索引JSON数据以便更快地访问,尤其是JSONB版本10更强大。?PostgreSQL完全免费,是BSD协议。如果你改了PostgreSQL,然后卖钱,没人会理你。这很重要,因为它表明PostgreSQL数据库不受其他公司控制。相反,MySQL现在主要由甲骨文公司控制。MySQL相对于PG的优势①InnoDB基于回滚段的MVCC机制优于基于XID的PG新旧数据存储在一起的MVCC机制。新旧数据存储在一起,需要定时触发VACUUM,会带来冗余IO和数据库对象加锁开销,导致数据库整体并发能力下降。而且,如果不及时清理VACUUM,还可能造成数据膨胀。②MySQL使用索引组织表。这种存储方式非常适合基于主键匹配的查询和删除操作,但是在表结构的设计上有一定的限制。③MySQL的优化器比较简单,系统表、运算符、数据类型的实现非常精简,非常适合简单的查询操作。④MySQL在国内比PG更受欢迎,但是PG在国内似乎有点落寞。⑤MySQL的存储引擎插件机制使其应用场景更加广泛。比如InnoDB除了适用于事务处理场景外,Myisam适用于静态数据查询场景。11.总结总的来说,开源数据库都不是很完善,商业数据库Oracle在架构和功能上还是完善了很多。在应用场景上,PG更适合严格的企业应用场景(如金融、电信、ERP、CRM),但不限于此。PostgreSQL的json、jsonb、hstore等数据格式特别适合一些大数据格式的分析。MySQL更适用于业务逻辑相对简单、数据可靠性要求不高的互联网场景(如Google、Facebook、阿里巴巴)。当然,MySQL现在正在大力开发InnoDB引擎,其功能表现也不错。MySQL和PostgreSQL是复杂的开源关系数据库。本文只是作者根据自己的经验对PG和MySQL的理解。难免有不合适的地方。请纠正我任何不适当的部分。MySQL在国内的发展已经非常成熟,但是如果你转向PostgreSQL,你会发现不一样的世界,学术风格,丰富的功能,一定会给你带来不一样的惊喜。作者:郭庆辉编辑:陶佳龙来源:转载自微信公众号东方龙马(ID:OLM-FWH)。
