当PG遇上Mysql
什么是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 许可协议。转载请注明出处!