什么是PostgreSQL?比MySQL、Oracle强在哪( 二 )


在国内 , 越来越多的公司开始使用PostgreSQL , 如斯凯网络的后台数据库使用的基本都是PostgreSQL数据库 , 去哪儿网(qunar.com)和平安科技也大量地使用了PostgreSQL数据库 。
主流的云服务提供商如亚马逊、阿里云、腾讯云、华为云也都提供了PostgreSQL的云数据库服务 。
更多关于PostgreSQL数据库的现状信息可见PostgreSQL官方网站:
http://www.postgresql.org/
【什么是PostgreSQL?比MySQL、Oracle强在哪】 04 PostgreSQL数据库与其他数据库的对比
本节主要介绍PostgreSQL数据库与主流数据库MySQL和Oracle的相同点和区别 。
1. PostgreSQL与MySQL数据库的对比
什么是PostgreSQL?比MySQL、Oracle强在哪
本文插图
可能有人会问 , 既然已经有一个人气很高的开源数据库MySQL了 , 为什么还要使用PostgreSQL?这主要是因为不同的数据库有不同的特点 , 应该为合适场景选择合适的数据库 。 在一些应用场景中 , 使用MySQL有以下几大缺点 。

  • 复杂SQL支持弱
在MySQL 8.0之前 , 多表连接查询的方式只支持“Nest Loop” , 不支持Hash JOIN和Sort Merge JOIN(注:MySQL8.0版本开始支持Hash JOIN , 但不完善 , 有一些问题 。
另因为MySQL无完善的基于COST的优化器(CBO) , 长期来说也会存在一定的问题) , 不仅如此 , 它对很多SQL语法都不支持 , 子查询性能比较低 。 例如 , MySQL不支持单独的sequence , 有公司为此还专门开发了统一序号分发中心的软件 。
  • 性能优化工具与度量信息不足
如果MySQL在运行过程中出现问题 , 性能监控数据较少 , 维护人员要准确定位问题存在一定的困难 。
  • MySQL的复制是异步或半同步的逻辑同步 , 这存在两个问题
一是在大事务下会导致比较大的延迟;二是容易导致数据库的不一致 , 原因是逻辑复制容易导致数据的不一致性 , 而MySQL的双层日志会让这个问题变得更复杂 , 即主备库的复制是通过逻辑层的binlog来实现的 , 但在存储引擎InnoDB下还有物理的Redo Log层 , 整个过程比较复杂 , 比较难保证主备库之间完全一致 。
由于有两层日志(binlog日志和InnoDB的Redo日志) , 因此也很难做到Master/Slave在异常切换过程中的零数据丢失 。 一些第三方公司改造MySQL源代码以实现同步复制 , 但这些方案要么是没有开源 , 要么是已开源却又不是很稳定 , 所以 , 对于普通用户来说 , 如何实现零数据库丢失的同步复制是一个令人头疼的问题 。
  • 在线操作功能较弱
很多在线DDL需要重建表 , 代价很大 , 有一些操作还会锁表 。 一些大的互联网公司或者修改MySQL源码来实现在线DDL功能 , 或者通过上层架构来解决这个问题 , 如先在Slave数据库上把DDL做完 , 然后把应用从Master库切换到Slave库 , 再到原先的Master上把DDL做完 。
对于第一种方法 , 需要公司有很强的MySQL研发能力 , 第二种方法则需要公司有较强的开发能力 , 能设计出较强的应用架构 。 这对于一些中小型公司来说不太容易实现 。
  • 难以写插件来扩展MySQL的功能
虽然用UDF , 或通过外部动态库中的函数来扩展部分功能 , 但能扩展的功能很有限 。 如MySQL比较难访问其他数据库中的数据 。
相对MySQL的这些弱点 , PostgreSQL有以下几个优点 。
  • 功能强大
支持所有主流的多表连接查询的方式 , 如“Nest loop”“Hash JOIN”“Sort Merge JOIN”等;支持绝大多数的SQL语法 , 如CTE(MySQL8.0之前不支持CTE) 。
PostgreSQL是笔者见过的对正则表达式支持最强、内置函数也是最丰富的数据库 。 它的字段类型还支持数组类型 。 除了可以使用PL/PGSQL写存储过程外 , 还可以使用各种主流开发语言的语法(如Python语言的PL/Python、Perl语言的PL/Perl来写存储过程) 。