什么是PG?

PostgreSQL是一个功能强大且完全开源的数据库。它提供了单个完整功能的版本,而不像MySQL那样提供了多个不同的社区版、商业版与企业版。
PostgreSQL基于自由的BSD/MIT许可,任何组织可以任意使用、修改以及重新分发代码。事实上国内阿里以及腾讯号称自研的商业数据库也都是基于PostgreSQL衍生的。

为什么是PG?

一切都是相对的,一切事物都需要参照物,没有对比就没有优劣。虽然PG方方面面对标的一直是Oracle,但是由于Oracle收费,所以我们在技术选型时,往往会将MySQL跟PG做对比,所以我们在这里也选择MySQL来吊打。

总体描述

  • PG:”最先进的开源关系型数据库“。
  • MySQL:”最流行的开源关系型数据库“。

商业环境

  • 开源协议:PG遵循BSD/MIT许可,任何企业任何组织可以任意使用甚至修改再盈利,而MySQL基于GPL许可,也允许企业免费使用,但随着MySQL被oracle公司收购,在商业版和社区版之间的功能取舍上也难免会有厚此薄彼之嫌。PG赢

  • 发行版本:PG提供了单个完整功能的版本,MySQL提供了多个不同的社区版、商业版与企业版。PG赢

  • 大版本发布速度: PG每年一个大版本发布,大版本发布的第二年就可以上生产环境,版本迭代速度很快。MySQL的大版本发布一般是2年~3年,一般大版本发布后的第二年才可以上生产环境,避免有坑,版本发布速度比较慢。这也是由于MySQL的维护者是商业公司导致,各有优劣。平局

  • 流行趋势:不可否认MySQL依旧是当前Web项目中的顶流,开发者MySQL技能必备,对PG有一定技术积累的还是相对较少。但近年来PG也在慢慢进入人们的视野,流行度呈逐步上升的趋势。MySQL赢。

技术实现

  • 支持的数据类型:由于PG的大而全,所以整个PG的复杂度相对较高,从PG支持的数据类型里可见一斑,常见的数值、文本、日期、布尔、json等基础类型支持不必赘述,其他类型几乎应有仅有,如货币类型、网络地址类型、枚举类型、几何类型、文本搜索类型(支持全文检索及分词)、XML类型、数组类型、范围类型等等等。甚至你可以自定义一个对象类型。而MySQL仅支持基础类型。PG赢

  • 索引类型
    PG支持多种索引类型btree , hash , gin , gist , sp-gist , brin , bloom , rum , zombodb , bitmap,部分索引,表达式索引;MySQL仅支持btree 索引,全文索引(低效),表达式索引(需要建虚拟列),hash 索引只在内存表。PG赢

  • SQL特性支持:
    PGSQL特性支持94种,SQL语法支持最完善,例如:支持公用表表达式(WITH查询、窗口函数、递归查询等)。MySQL的SQL特性支持情况支持36种,SQL语法支持比较弱,WITH查询、窗口函数、递归查询概不支持。PG赢。

  • DDL操作:PGSQL加字段、可变长字段类型长度改大不会锁表,所有的DDL操作都不需要借助第三方工具,并且跟商业数据库一样,DDL操作可以回滚,保证事务一致性。
    而MySQL由于大部分DDL操作都会锁表,例如加字段、可变长字段类型长度改大,特别是对大表进行DDL操作DDL操作不能回滚。PG赢。

  • 物化视图:PGSQL支持物化视图;MySQL不支持物化视图。PG赢。

  • MVCC机制实现的区别:MySQL基于回滚段实现的MVCC机制,但是MySQL的间隙锁影响较大,锁定数据较多,对高并发的支持有限。PG基于XID的MVCC机制进行多版本存储,保证了对高并发的支持,解决了数据库常见瓶颈问题。这种机制也导致PG的维护成本稍微高了那么一点点(需要定期VACUUM)。不考虑业务场景的情况下,平局。

运行维护

  • CPU限制:PGSQL没有CPU核心数限制,有多少CPU核就用多少MySQL能用128核CPU,超过128核用不上。PG赢。

  • 配置文件参数:PGSQL一共有255个参数,用到的大概是80个,参数比较稳定,用上个大版本配置文件也可以启动当前大版本数据库。MySQL一共有707个参数,用到的大概是180个,参数不断增加,就算小版本也会增加参数,大版本之间会有部分参数不兼容情况。PG赢。

  • 第三方工具依赖情况:PG只有高可用集群需要依靠第三方中间件,例如:patroni+etcd、repmgr; MySQL大部分操作都要依靠percona公司的第三方工具(percona-toolkit,XtraBackup),工具命令太多,学习成本高,高可用集群也需要第三方中间件,官方MGR集群还没成熟。PG赢。

  • 高可用主从复制底层原理: PG物理流复制,属于物理复制,跟SQL Server镜像/AlwaysOn一样,严格一致,没有任何可能导致不一致,性能和可靠性上,物理复制完胜逻辑复制,维护简单MySQL主从复制,属于逻辑复制,(sql_log_bin、binlog_format等参数设置不正确都会导致主从不一致)大事务并行复制效率低。PG赢。

学习曲线

对于简单的业务逻辑,MySQL与PG在性能和效率上并没有太大差距,在开发效率上切换成本并没有很高,相当于之前MySQL现在切换成Oracle,CRUD语句并没有太大差别。
而对于复杂的查询统计逻辑,MySQL和PG在性能和执行效率上是有天壤之别的,在开发效率上基本没啥可比性,因为MySQL它根本就不支持一些复杂的逻辑查询。而开发者确实是需要不断提升对PG特性的熟悉程度,才能快速的开发。而这种丰富性或者说是复杂性,恰恰是PG的优势,并非PG的缺陷。 平局。

总结

MySQL是应用开发者创建出来的DBMS;而PostgreSQL是由数据库开发者创建出来的DBMS 。换句话说,MySQL倾向于使用者的角度,回答的问题是 “你想解决的是什么问题”;而PostgreSQL倾向于理论角度,回答的问题是 “数据库应该如何来解决问题” 。

MySQL一般会将数据合法性验证交给客户;PostgreSQL在合法性方面做得比较严格。比如MySQL里插入 “2012-02-30” 这个时间时,会成功,但结果会是 “0000-00-00”;PostgreSQL不允许插入此值。

通常,PostgreSQL 被认为特性丰富,且对复杂查询的效率更高,而MySQL被认为在简单查询速度更快。但这个观点基本是在 MySQL 4.x / PostgreSQL 7.x 的事情,现在情况已经变了,PostgreSQL 在9.x版本速度上有了很大的改进,而MySQL特性也在增加(但MySQL的商业背景决定了它无法在特性支持上跟PG比拟)。

从应用场景来说,PG更加适合严格的企业应用场景(比如BI、金融、电信、ERP、CRM),而MySQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(其实相对PG来说也有并发插入的瓶颈问题)。PG赢麻了。

怎么开始?

我相信随着外界技术环境的不断升级、随着我们项目的不断优化,会有越來越多的系统会对PG予以青睐,欢迎拥抱PostgreSQL。

参考资料

https://www.postgresql.org/about/

https://www.runoob.com/postgresql/postgresql-tutorial.html

https://www.biaodianfu.com/mysql-vs-postgresql.html

https://www.zhihu.com/question/20010554/answer/2320511271

https://www.zhihu.com/question/20010554/answer/2280773945

本文作者:Lee
本文地址leeblog.icu/2022/06/22/
版权声明:本博客所有文章除特别声明外,均采用 CC 4.0 BY-NC-SA 许可协议。转载请注明出处!