1.什么是PostgreSQL?PostgreSQL数据库是一个强大的开源数据库,支持丰富的数据类型(如JSON和JSONB类型、数组类型)和自定义类型。PostgreSQL数据库提供了丰富的接口,可以方便地扩展其功能。比如可以在GiST框架下实现自己的索引类型,支持使用C语言编写自定义函数和触发器,也支持使用流行的编程语言编写自定义函数。定义函数。PL/Perl提供了用Perl语言编写自定义函数的功能,当然还有PL/Python、PL/Java、PL/Tcl等。二、PostgreSQL数据库的优点PostgreSQL数据库有以下优点:PostgreSQL数据库是目前最强大的开源数据库,是最接近行业标准SQL92的查询语言,至少实现了SQL:2011标准160项中要求的179个主要功能(注:目前还没有数据库管理系统可以完全实现SQL:2011标准中的所有主要功能SQL:2011标准)。稳定可靠:PostgreSQL是唯一可以做到数据零丢失的开源数据库。目前有消息称,国内外部分银行使用PostgreSQL数据库。开源省钱:PostgreSQL数据库开源免费,使用类BSD协议,所以使用和二次开发基本没有限制。支持广泛:PostgreSQL数据库支持大量主流开发语言,包括C、C++、Perl、Python、Java、Tcl、PHP等。PostgreSQL社区活跃:PostgreSQL基本上每3个月发布一个补丁版本,这意味着已知的BUG会很快得到修复,及时响应应用场景的需求。3.PostgreSQL应用现状及发展趋势PostgreSQL目前在国外非常流行,尤其是近几年越来越多的公司使用PostgreSQL数据库。日本电报电话公司(NTT)大量使用PostgreSQL替代Oracle数据库,并在PostgreSQL之上开发了Postgres-XC。Postgres-XC是一个完全兼容PostgreSQL用户接口的无共享架构的数据库集群。亚信基于Postgres-XC开发了AntDB数据库。AntDB是面向金融、电信、政务、安全、能源等行业的分布式事务型关系型数据库产品。具有集群自动高可用、秒级在线扩缩容、异地容灾、SQL语句级自定义分片、分布式事务、MVCC等功能,Oracle兼容性强。AntDB与PostgreSQL数据库完全兼容。腾讯基于PosgreSQL-XC开发了TBase分布式数据库。与Postgres-XC相比,其稳定性有了很大的提高。同时,TBase创造性地将GROUP概念引入内核,并提出了双密钥分发策略,有效解决了数据倾斜问题;它基于数据的时间戳,将数据分为冷数据和热数据,分别存储在不同的存储设备中,有效解决了存储成本问题。VoIP公司Skype也广泛使用PostgreSQL,并贡献了以下支持PostgreSQL数据库的开源软件。PL/Proxy:PostgreSQL中的水平数据拆分软件。pgQ:使用PostgreSQL的消息队列软件。Londiste:一个用C语言实现的软件,用于PostgreSQL数据库之间的逻辑同步。全球最大的CRM软件服务提供商Salesforce也开始使用PostgreSQL,并聘请了PostgreSQL内核开发人员TomLane。著名的图片分享网站instagram也大量使用了PostgreSQL。2012年,美国联邦机构全面转向PostgreSQL阵营;法国也在积极推动政府机构采用PostgreSQL数据库替代商业数据库。在中国,越来越多的公司开始使用PostgreSQL。比如SkyeNetwork的后台数据库,基本都是使用PostgreSQL数据库。去哪儿网和平安科技也大量使用PostgreSQL数据库。亚马逊、阿里云、腾讯云、华为云等主流云服务商也提供PostgreSQL云数据库服务。更多关于PostgreSQL数据库的现状,请参见PostgreSQL官网:http://www.postgresql.org/4.PostgreSQL数据库与其他数据库的比较本节主要介绍PostgreSQL数据库与其他数据库的异同。主流数据库MySQL和Oracle。一、PostgreSQL与MySQL数据库的比较有人会问,既然已经有了非常流行的开源数据库MySQL,为什么还要用PostgreSQL呢?这主要是因为不同的数据库有不同的特点,应该针对合适的场景选择合适的。数据库。在一些应用场景中,使用MySQL有以下主要缺点。(1)对复杂SQL的支持较弱在MySQL8.0之前,多表连接查询方式只支持“NestLoop”,不支持HashJOIN和SortMergeJOIN(注:MySQL8.0开始支持HashJOIN,但是不完美,还存在一些问题。另外,由于MySQL没有完整的基于COST的优化器(CBO),从长远来看会存在一定的问题),不仅如此,它不支持很多SQL语法,而且子查询的性能相对较低。比如MySQL不支持单独序列号,一些公司为此专门开发了统一序列号分配中心的软件。(2)性能优化工具和测量信息不足如果MySQL在运行过程中出现问题,性能监控数据很少,维护人员很难准确定位问题。MySQL的复制是异步或者半同步的逻辑同步,有两个问题:一是在大事务下会造成比较大的延迟;但是MySQL的双层日志会让这个问题变得更加复杂,即主备数据库的复制是通过逻辑层的binlog来实现的,但是在存储引擎InnoDB下还有一个物理的RedoLog层,而且整个过程比较复杂。很难保证主备数据库完全一致。由于有两层日志(binlog日志和InnoDB的Redo日志),在Master/Slave的异常切换过程中也很难做到数据零丢失。一些第三方公司修改MySQL源码实现同步复制,但是这些方案要么不开源,要么开源但不太稳定,所以,对于普通用户来说,如何实现零数据库丢失的同步复制是一个挑战让人头疼。(3)在线操作功能薄弱。很多线上的DDL需要重建表,开销很大,而且有些操作会锁表。一些大型互联网公司要么修改MySQL源码实现在线DDL功能,要么通过上层架构解决这个问题,比如先在Slave数据库上完成DDL,然后将应用从Master数据库切换到Slave数据库,然后到原始数据库。在Master上完成DDL。对于第一种方式,企业需要具备较强的MySQL研发能力,而第二种方式则需要企业具备较强的开发能力,能够设计出强大的应用架构。这对于一些中小型企业来说并不容易实现。(4)难以编写插件来扩展MySQL的功能。虽然可以使用UDF或者外部动态库中的函数来扩展一些功能,但是可以扩展的功能非常有限。例如,MySQL更难访问其他数据库中的数据。与MySQL的这些弱点相比,PostgreSQL有以下优点。强大支持所有主流的多表连接查询方式,如“Nestloop”、“HashJOIN”、“SortMergeJOIN”等;支持大部分SQL语法,比如CTE(MySQL8.0之前不支持CTE)。PostgreSQL是我见过的对正则表达式支持最强,内置函数最丰富的数据库。它的字段类型也支持数组类型。除了使用PL/PGSQL编写存储过程外,还可以使用各种主流开发语言的语法(如Python语言中的PL/Python、Perl语言中的PL/Perl来编写存储过程)。这些强大的功能可以大大节省开发资源。很多开发者在PostgreSQL上开发的时候,会发现数据库实现了很多功能,甚至有些业务功能已经不需要写代码实现,直接使用数据库的功能就可以解决问题。性能优化工具和丰富的度量信息PostgreSQL数据库中有大量的性能视图,可以很容易地定位问题(比如可以看到正在执行的SQL,可以看到谁在等待,哪些记录被锁定)锁定视图)。PostgreSQL设计了一个特殊的架构和流程来收集性能数据,包括物理I/O的统计,以及表扫描和索引扫描的性能数据。良好的在线操作功能PostgreSQL在添加一个空值的列时,本质上是在系统表上定义该列,而不更新物理结构,这使得PostgreSQL可以瞬间添加一个列。PostgreSQL还支持在线创建索引的功能,更新操作可以在索引创建过程中解锁。从PostgreSQL9.1开始支持同步复制(synchronousreplication),通过Master和Slave之间的复制可以实现零数据丢失的高可用方案。您可以轻松编写插件来扩展PostgreSQL数据库的功能。PostgreSQL提供了安装和编写插件的整体框架,比如创建extension等SQL语句,方便加载插件;写一个动态库可以方便的给PostgreSQL添加函数;基于外部数据源(FDW)的框架和编程接口,可以轻松编写访问其他数据库和外部数据源的插件。现在已经有针对现有常见外部数据源的第三方插件,如Oracle、MySQL、SQLServer等数据库,通过插件可以方便的在PostgreSQL数据库中访问外部数据。另外PostgreSQL还提供了hook函数接口,可以实现更强大的插件,比如pg_pathman分区表插件,citus分库分表插件等。另外,由于MySQL对SQL语法弱,基本不适合做数据仓库。虽然一些厂商已经开发了MySQL数据仓库的存储引擎(如Infobright),但这种方案只是解决了部分数据仓库问题,并不能彻底解决SQL功能弱的问题。而且Infobright的社区版在功能上有很多限制,比如不支持数据更新,不支持过多的并发执行(最多十几个)等。PostgreSQL不仅支持复杂的SQL,还支持大量解析功能,非常适合数据仓库。PostgreSQL数据库中还有一些支持移动互联网的新功能,比如空间索引。PostGIS是最著名的开源GIS系统,它是PostgreSQL的一个插件,在PostgreSQL中使用起来非常方便。LBS中的一些位置计算问题也可以通过PostGIS轻松解决。综上所述,PostgreSQL数据库是一个具有强大功能和移动互联网特性的开源数据库。如果你只是想把数据库作为一个简单的存储软件使用(一些大型互联网公司就是这样),而你想在应用中实现一些比较复杂的功能,那么选择MySQL或者一些NoSQL产品是合适的。如果你的应用的数据访问非常简单(比如大部分的博客系统),那么后端使用MySQL也是非常合适的。但是如果你的应用不像博客系统那么简单,又不想消耗太多的开发资源,那么PostgreSQL是一个非常明智的选择。最有说服力的例子是照片共享公司Instagram。使用“Python+PostgreSQL”架构后,支撑整个公司业务的只有十几个人。在数据库中使用PostgreSQL感觉就像在开发语言中使用Python一样,会让你的工作更加简洁高效。2.PostgreSQL与Oracle数据库的比较从功能上来说,PostgreSQL可以与Oracle数据库相媲美。Oracle数据库是目前最强大的商业数据库,PostgreSQL是最强大的开源数据库。Oracle在RAC、ASM等集群功能上比较强,但是PostgtreSQL也有一些比Oracle强的特性,比如索引和可扩展性。PostgreSQL与Oracle有许多相似之处。它们都使用共享内存进程结构。客户端与数据库服务器建立连接后,数据库服务器启动一个进程为连接提供服务。这与MySQL的线程模型不同。PostgreSQL与Oracle相同。PostgreSQL的WAL日志和Oracle的Redo日志是用来记录物理块数据变化的,这与MySQL的binlog不同。PostgreSQL在主备数据库方面非常完备。它可以构建同步备库、异步备库和延迟备库。在同步备库中,可以配置数据同步到任意一个备库。只读备库在查询和应用日志的冲突解决中提供了更多的参数控制,使得DBA更容易控制只读备库中的查询冲突。在配置备库的过程中,PostgreSQL比Oracle简单很多,备库的构建也更加灵活。PostgreSQL和Oracle的区别在于PostgreSQL有更多的功能来支持Internet特性。例如,PostgreSQL数据类型支持网络地址类型、XML类型、JSON类型、UUID类型、数组类型,具有强大的正则表达式功能。比如where条件可以使用正则表达式匹配,也可以用Python、Perl等语言编写。存储过程等。另外,PostgreSQL更小。PostgreSQL在内存小的机器上可以完美运行,比如512MB的云主机,而Oracle数据库基本可以在几G的云主机上运行。Oracle安装包的大小往往超过几GB,而PostgreSQL的安装包只有几十MB。PostgreSQL可以很容易地安装在任何环境中。Oracle数据库安装需要几个小时,而PostgreSQL可以在几分钟内安装。
