经常会有人问我PostgreSQL是什么?
这个问题不太好回答,因为PostgreSQL除了可以让你做到几乎所有其他主流关系型数据库能做的事情外,还可以做到很多别的数据库做不到的事情。
如果非要一个简单直接、便于理解的定义,那么你可以理解为一个开源可自由扩充的Oracle。
尽管这并不是非常准确。因为PostgreSQL对程序员要更友好一些,下图是来自StackOverflow 2017年的一些统计,参考Developer Survey Results 2017:
- 最想要的数据库
- 最爱的数据库
如果只是说关系型数据库,那么“StackOverflow年度统计中开发者最爱和最想要的关系型数据库”这个结论不难得出。
而对比其中的最热门:
你会发现一个有意思的现象:对你最好的未必是那个大家都知道的。
PostgreSQL好在哪里?
在回答了前面的回答之后,这是更多的人会想问的第二个问题。
而对于这颗沧海遗珠,用一句话其实难以尽述。如果非要总结,可以认为有以下几点:
稳定
PostgreSQL的代码质量是被很多人认可的,经常会有人笑称PG的开发者都是处女座。基本上,PG的一个大版本发布,经过三两个小版本就可以上生产,这是值得为人称道的一个地方。从PostgreSQL漂亮的commit log就可见一斑,[PostgreSQL的COMMIT LOG](https://git.postgresql.org/gitweb/?p=postgresql.git;a=log;h=6912acc04f0bbcfdb799a120618507601e862490) 而得益于PostgreSQL的多进程架构,一个连接的异常并不影响主进程和其他连接,从而带来不错的稳定性。
- 性能
我们内部有些性能上的数据,TPCC的性能测试显示PostgreSQL的性能与商业数据库基本在同一个层面上。
丰富
PostgreSQL的丰富性是最值得诉说的地方。因为太丰富了,以至于不知道该如何突出重点。最全面的例子,可以找 自带博客外挂光环的 @德哥 。这里只列举几个我认为比较有意思的几点(查询、类型、功能):
查询的丰富
且不说HASH\Merge\NestLoop JOIN,还有递归、树形(connect by)、窗口、rollup\cube\grouping sets、物化视图、SQL标准等,还有各种全文检索、规则表达式、模糊查询、相似度等。在这些之外,最重要的是PostgreSQL强大的基于成本的优化器,结合并行执行(并行扫瞄、并行JOIN等)和多种成本因子,带来各种各样丰富灵活高效的查询支持。
类型的丰富
如高精度numeric, 浮点, 自增序列,货币,字节流,时间,日期,时间戳,布尔, 枚举,平面几何,立体几何,多维几何,地球,PostGIS,网络,比特流,全 文检索,UUID,XML,JSON,数组,复合类型,域类型,范围,树类型,化 学类型,基因序列,FDW, 大对象, 图像等。 [PS: 这里的数组,可以让用户像操作JAVA中的数组一样操作数据库中的数据,如 item[0][1]即表示二维数组中的一个元素,而item可以作为表的一个字段。] 或者,如果以上不够满足,你可以自定义自己的类型(create type),并且可以针对这些类型进行**运算符重载**,比如实现IP类型的加减乘除(其操作定义依赖于具体实现,意思是:你想让IP的加法是什么样子就是什么样子)。 另外还有各种索引的类型,如btree, hash, gist, sp-gist, gin, brin , bloom , rum 索引等。你甚至可以为自己定义的类型定制特定的索引和索引扫瞄。
功能的丰富
PostgreSQL有一个无与伦比的特性——插件。其利用内核代码中的Hook,可以让你在不修改数据库内核代码的情况下,自主添加任意功能,如PostGIS、JSON、基因等,都是在插件中做了很多的自定义而又不影响任何内核代码从而满足丰富多样的需求。**而PostgreSQL的插件,不计其数**。 FDW机制更让你可以在同一个PostgreSQL中像操作本地表一样访问其他数据源,如Hadoop、MySQL、Oracle、Mongo等,且不会占用PG的过多资源。**比如我们团队开发的OSS\_FDW就用于实现对OSS的读写**。
至于其他的,举个简单的例子,PostgreSQL的DDL(如加减字段)是可以在事务中完成的 [PS: PostgreSQL是Catalog-Driven的,DDL的修改基本可以理解为一条记录的修改]。这一点,相信做业务的同学会有体会。
谈到与商业数据库的对比,这里有一张比较有意思的图,权作消遣:
可以看得出来,PostgreSQL与很多商业数据库还是有一定历史渊源上的,大多是基于System R。
如果觉得不过瘾,再来点干的,看看PostgreSQL与这些数据库大厂这些年的恩爱情仇(图比较大,PG在左边最上面那条线,然后连着中间最上面第二条线):
如何开始
业务从一个数据库迁移到另外一个数据库,不是一件容易的事。那么,你是否要考虑一下,在新的业务上尝试不同的可能?
关于选型,这篇数据库选型十八摸 之 PostgreSQL - 致 架构师、开发者可能会帮到你。
另外,这里有PG大神@德哥准备的系列的培训资料,和PG入门文档
而更多的资料,在云栖上搜索”postgresql"即可,这里是传送门:更多文章资料
Have fun!