之前呢!笔者在某平台上看了关于PostgreSQL相关的内容,并且看到下面评论中问到关于PostgreSQL这个数据库到底好不好用。那么下面我们就来聊聊关于PostgreSQL相关的内容,并且相比较于MySQL等一些数据到底有什么样的区别。
PostgreSQL自称是目前为止最先进的关系型数据库,但是事实上,它不仅仅只是一个单纯的关系型的数据库。它其实还支持了一些非关系型数据的存储,也就是说它还支持了一些NoSQL的数据类型。例如用它可以实现KV键值对的存储,可以实现JSON数据的存储。
其实从本质上来讲,PostgreSQL才是真正的NoSQL,也就是Not Only SQL,不仅仅是SQL。这就是因为它不仅仅支持了关系型数据的存储,而且还支持了非关系型数据的存储,也就是说从另外一个角度上来讲,PostgreSQL其实可以理解为一个全栈类型的数据库。
那么什么是全栈呢?这里的全栈就是指它所能支持的使用场景比较的多,可以支持各种各样的扩展。
上面我们提到,PostgreSQL所支持的数据类型非常的丰富,这样使得它所能适配的场景会比较多,另外一点就是它也是可以支持事务操作的,而且它还提供了非常丰富的数据分析工具,虽然定位是一个对象关系数据库,但是它对于一些SQL结构化查询的支持也是非常好的。在有些方面的SQL操作的支持要比MySQL要更加的丰富,包括对于子查询、窗口函数等的支持。
PostgreSQL还支持了时序数据存储、地理位置信息的存储、数据仓库等PG都提供了它对应的解决方案。而且想必很多人也对其很多支持的高可用实现方案有所了解。例如PostgreSQL它也支持高可用集群部署方案,并且支持副本的冗余、也支持内存主从同步机制,它内置的基于二进制的同步复制方式在大部分情况下,比MySQL所支持的基于binlog的同步方式可能更加可靠。
另外就是PostgreSQL是它所支持的开源协议是BSD,也就是说它的开发的自由度会比较高,我们甚至可以基于PostgreSQL可以进行一些二次开发,并且二次开发的产品也可以变成自己的商业产品,国内有很多的数据仓库都是基于它来进行的二次开发,所以很多云原生的关系型数据库基本上都与它有着或多或少的联系,这也是PostgreSQL社区一直非常活跃的原因之一。
PostgreSQL的扩展性也是比较强的,它是基于目录驱动进行的扩展。可以非常灵活的在其中添加一些数据类型、操作方式、以及内置函数等等。这过程也是非常弹性的也就是说你用的时候可以将它加上,不用的时候删除就可以了,不需要进行多余的编译加载的操作。这也是PostgreSQL为什么可以支持去自定义一些新的数据类型的原因。
MySQL是基于GPLv2开源协议,虽然社区活跃度也不低,但是它背后毕竟是甲骨文,所以说商业化程度其实并不是太高。
MySQL支持了很多的存储引擎,除了InnoDB和NDB之外,其他的引擎都不支持事务操作。像是PostgreSQL的话它就只有一个存储引擎,所以直接就是支持事务的。虽然这种方式可以省去你选择的麻烦,但是所带来的问题就是无法进行合理的均衡设计,但是从另一个方面来讲,既然支持了,就一定会考虑性能,但是它在某些场景中,例如遇到一些小数据量的读写,可能就比不过MySQL所支持的一些其他的存储引擎了。
PostgreSQL对于SQL语句的兼容性要比MySQL要更好一些,像是对于一些子查询的支持,对于联表查询等PostgreSQL的性能要比MySQL要更好一些。
PostgreSQL对于客户端程序的支持,要比MySQL支持的要更丰富。
PostgreSQL对于数据类型的支持也要比MySQL要更多一些。例如它可以用来存储一些JSON,XML格式的数据。对于这种数据的支持可能PostgreSQL要略胜于MySQL。这主要是因为PostgreSQL在操作一些并发读写的时候,会省略在MySQL中底层所支持的一些锁的操作。但是在对于数据量较小的情况下,MySQL会更加方便。这其实也是非常符合很多真实场景中所暴露出来的问题的。
所以如果在某些实在是不方便进行分库分表的场景下,并且单个表的数据量比较大的情况下,并且还有很多复杂的查询操作的时候,可能使用PostgreSQL会更加好一些。但是需要注意,在一些并发场景下由于MySQL的操作会进行一些底层处理,在内存消耗方面要比PostgreSQL要小,这是因为PostgreSQL是基于进程进行的处理,也就是说一个客户端对应一个进程,而在MySQL中一个请求只对应着一个线程。相比较而言,进程消耗的资源可能要比线程消耗的资源要大得多。所以并不是说PostgreSQL在处理这种场景就一定好,只是相对而言要比MySQL要性能更好,但是它需要一些其他的手段来保证这种性能优势。
在很早之前就有人扬言PostgreSQL的性能已经完全碾压MySQL了,但是MySQL人家又不是没有在发展变化,所以说MySQL在不断的升级迭代的过程中对性能上的提升也是有目共睹的。
要不要使用PostgreSQL还是要根据实际的使用场景来决定?第一,就是你要开发的系统是一个新的系统,第二,就是老系统是否需要使用PostgreSQL来进行迭代。
这就要看后续的开发场景了,如果后续的开发过程中可能会遇到一些非结构化的存储,或者是会存储一些KV数据,存储一些地理位置信息,存储一些带有时序性的数据,那么对于这些数据的存储,就要考虑是否使用PostgreSQL了。
当然这种数据也可以使用MySQL来进行存储,但是有一点,能用不代表好用。反过来也是一样的。PostgreSQL所支持的有些操作,在对于一些数据的处理上来讲,也或许没有MySQL更加好用。
毕竟专业的数据存储还是要专业的数据库来进行支持的么。
另外需要注意的就是PostgreSQL只支持了一个存储引擎,所以对于运维这方面的要求还是比较高的。如果团队里面没有对PostgreSQL非常精通的DBA的话建议还是不要使用了。因为数据这种东西,毕竟是会影响很多的东西的,基本上属于各个公司的核心数据资产,一旦丢失后果非常严重。
考虑到以上这些内容,你就要看看新项目中是否使用PostgreSQL数据库,并且老项目中是否需要对数据库这方面进行迭代升级,对于这一点,笔者还是不太建议老项目进行迭代。因为你无法保证项目就一定合适,也无法保证数据就一定支持。