概述本文介绍了MySQL和PostgreSQL的一些特性对比,让大家了解两者的优缺点,做出更好的选择。在目前国内的情况下,大多数互联网公司都在使用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的版权在Oracle手中,Oracle可以推广其商业闭源版本。如上图所示,开源软件协议2,支持ACIDPostgreSQL支持事务一致性强,事务保证好,全面支持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的新旧数据基于XIDMVCC机制存储在一起。新旧数据存储在一起,需要定时触发VACUUM,会带来冗余IO和数据库对象加锁开销,导致数据库整体并发能力下降。而且,如果不及时清理VACUUM,还可能造成数据膨胀。当然,PostgreSQL对比较也有一点影响。为了保证事务的强一致性,挂起的事务会影响所有表的VACUUM清理,导致表膨胀。MySQL仅支持InnoDB中的MVCC。InnoDB的MVCC机制是基于回滚段的,但是MySQL的间隙锁影响更大,锁住的数据更多。6.性能1.PostgreSQL1)PostgreSQL广泛应用于读写速度快、数据一致性高的大型系统中。此外,它支持各种性能优化,这当然只有在商业解决方案中才有,例如地理空间数据支持、无读锁的并发等。2)PostgreSQL性能最适合需要执行复杂查询的系统。3)PostgreSQL在OLTP/OLAP系统中表现出色,在读写速度和大数据分析方面表现出色。基于PG的GP数据库在数据仓库领域表现良好。4)PostgreSQL也适用于商业智能应用,但更适用于需要快速读写速度的数据仓库和数据分析应用。2.MySQL1)MySQL是一个范围广泛的基于网络的项目,它们需要一个数据库来进行简单的数据交易。但是,MySQL在负载很重或试图完成复杂查询时通常表现不佳。2)MySQL的读取速度在OLTP系统中表现良好。3)MySQL+InnoDB为OLTP场景提供了很好的读写速度。总体来说,MySQL在高并发场景下表现不错。4)MySQL可靠并且与商业智能应用程序配合良好,这些应用程序通常需要大量读取。七、高可用技术的实现1、PostgreSQL1)基于流复制的异步和同步主从。2)——基于流复制的keepalive。3)--基于流复制的repmgr。4)--基于流复制的patroni+etcd。5)共享存储HA(corosync+pacemaker)。6)Postgres-XC。7)Postgres-XL。8)中间件实现:pgpool、pgcluster、slony、plploxy。2、MySQL1)主从复制。2)大师与大师。3)MHA。4)LVS+保活。5)MGR分布式数据库,多点写入【不推荐】,基于paxos协议。6)PXC分布式数据库,多点写入【不推荐】,基于令牌环协议。7)INNODBCLUSTER【8.0新技术,基于MGR实现,上层封装命令】,基于paxos协议。8)中间件实现:mycat。8.外部数据源PostgreSQLFDW–[foreign-datawrapper的缩写,可称为外部包装。PostgreSQL不支持多数据引擎。但是它支持Extension组件扩展,通过一种叫做FDW的技术将Oracle、Hadoop、MongoDB、SQLServer、Excel、CSV文件等作为外部表进行读写。因此,它可以很好地连接大数据和关系数据库。MySQL:无。9、数据存储和数据类型PG主表存储在堆表中,存储大量数据,数据访问方式类似于Oracle的堆表。MySQL使用索引来组织表。MySQL必须有一个主键索引。所有的数据访问都是通过主键实现的。访问二级索引时,需要对索引进行两次扫描(主键和二级索引)。十、PostgreSQL与MySQL的优劣比较1、PostgreSQL相对于MySQL的优势1)SQL标准的实现比MySQL更完备,功能的实??现更严谨。2)存储过程的功能支持优于MySQL,具有在本地缓存执行计划的能力。3)对表连接的支持更完善,优化器功能更完善,支持的索引类型多,复杂查询能力强。4)PG主表存储在堆表中,MySQL采用索引组织表,可以支持比MySQL更大的数据量。5)PG的主备复制是物理复制。与MySQL基于binlog的逻辑复制相比,数据一致性更可靠,??复制性能更高,对主机性能影响更小。6)MySQL的存储引擎插件机制存在锁机制复杂影响并发的问题,而PG不存在。7)PG对可以实现外部数据源查询,支持的数据源类型丰富。8)PG原生的逻辑复制可以实现表级的订阅和发布,不需要其他组件就可以通过Kafka实现数据流转。9)PG支持嵌套循环、hashjoin、排序合并三种表连接方式,而MySQL只支持嵌套循环。10)PostgreSQL的源代码写的很清楚,可读性比MySQL强很多。11)PostgreSQL通过PostGIS扩展支持地理空间数据。地理空间数据具有直接在数据库级别可用的专用类型和函数,使开发人员的分析和编码更加容易。12)一个可扩展的系统,具有丰富的可扩展组件,作为贡献发布。13)PostgreSQL支持JSON和其他NoSQL特性,如原生XML支持和使用HSTORE的键值对。它还支持对JSON数据进行索引以加快访问速度,尤其是10版本的JSONB更加强大。14)PostgreSQL完全免费,是BSD协议。如果你改了PostgreSQL,然后卖钱,没人管你。这一点很重要,说明PostgreSQL数据库不会被其他公司控制。相反,MySQL现在主要由甲骨文公司控制。2、MySQL相对于PG的优势1)InnoDB基于回滚段的MVCC机制优于PG的基于XID的新旧数据存储在一起的MVCC机制。新旧数据存储在一起,需要定时触发VACUUM,会带来冗余IO和数据库对象加锁开销,导致数据库整体并发能力下降。而且,如果不及时清理VACUUM,还可能造成数据膨胀。2)MySQL使用索引组织表。这种存储方式非常适合基于主键匹配的查询和删除操作,但是在表结构的设计上有一定的限制。3)MySQL的优化器比较简单,系统表、算子、数据类型的实现都非常精简,非常适合简单的查询操作。4)MySQL在国内比PG更流行,PG在国内显得有点落寞。5)MySQL的存储引擎插件机制使其应用场景更加广泛。比如innodb除了适用于事务处理场景外,myisam适用于静态数据查询场景。总结总体来说,开源数据库并不完美,商业数据库oracle在架构和功能上还是要完善的多。在应用场景上,PG更适合严格的企业应用场景(如金融、电信、ERP、CRM),但不限于此。PostgreSQL的json、jsonb、hstore等数据格式特别适合一些大数据格式分析;而MySQL则更适合业务逻辑相对简单、数据可靠性要求不高的互联网场景(如Google、Facebook、阿里巴巴)。当然,MySQL现在正在大力开发InnoDB引擎,其功能表现也不错。MySQL和PostgreSQL是复杂的开源关系数据库。本文只是作者根据自己的经验对PG和MySQL的理解。难免有不合适的地方。不当之处请指正。MySQL在国内的发展已经非常成熟,但是如果你转战PostgreSQL,你会发现不一样的世界,学术风格,丰富的功能,一定会给你带来不一样的惊喜。
