使用postgresql的原因:
Postgresql一直以来对新增数据类型都是开放和友好的系统。 它有数组、空间地理以及很多时间相关的数据类型。几年前它又增加了两种值得我们关注和使用的新类型:
JSONB类型
JSONB 是一个二进制的JSON数据类型。它可以使用GIN 和 GIST格式进行索引。你也可以快速查询完整的JSON 文档。
Range范围类型
这个数据类型现在还没有JSONB有名,范围类型当它是你需要的类型时,它才会特别地有用。 对时间范围来说,使用一列字段来表达从一个值到另一个值的范围特别方便。如果你创建一个日历应用,或者总是有一个从哪个时间到另一个时间的参数,那范围类型可以让你只需使用一个字段值即可。更大的好处还有你可以指定一定的时间范围不能相互覆盖、交叉,或是其他对你的应用有用的约束。
Extensions扩展功能
谈到Postgres就很难不提到围绕它存在的生态系统。扩展模块的使用对社区来说很关键,同时也促使Postgres快速发展。扩展使用户可以让用户使用原生的系统连接Postgres核心,而不必是将需求提交给Postgres的核心开发。这也意谓着用户可以增加丰富的功能而不必与Postgres内核的发布和审核循环连在一起。
一些特别有名的重磅扩展有:
Citus扩展
Citus (这也是我工作的内容) 扩展让Postgres成为了一个分布式数据库,它允许用户很容易地将数据库进行跨节点的分发。 而对你的应用来说,它仍然像是一个单节点的数据库,而在后台,Citus会将数据传给多个不同的物理设备和多个Postgres的实例。
HyperLogLog扩展
这是一个我个人最为喜欢的扩展,它允许用户对大量数据的聚集的唯一计数有一个很容易获得且非常接接近理论值的结果,当然也可以对跨时间联合、相交等各种操作进行 处理。HyperLogLog和其他的概要逻辑对处理大数据集和分布式数据库很常用,并且是可以很方便地嵌入Postgres内部使用。
PostGIS扩展
PostGIS不是一个新的扩展,但它是一个值得重提亮点。它通常都是被认为是最先进的地理数据库。PostGIS增加了新的高级的地理空间数据类型、操作符,使得很多与位置有关的地图类或是路由类的操作变得很容易。
逻辑复制
多年以来,大家要求最多的就是解决Postgres中设置数据复制的易用性。最早时我们也有基本的复制方案,然后我们有了流复制技术(即二进制的WAL或称之为预写日志)。 对类似wal-e这样的工具,帮助提升了Postgres在灾难恢复方面的能力。
现在最近的版本里,我们有了逻辑复制,虽然现在还是需要一个扩展,不是100%内核功能,但最终我们还是有了一个完整的逻辑复制方案。逻辑复制允许用户发送不同数量的指令,这也意谓着我们可以复制指定的内容或表。
系统扩展性
除了我们见到的Postgres在持续对功能和性能的改进,最近也是特别地增加了并行查询功能以获取更好的性能。如果用户需要超出单个Postgres节点的扩展,我们可以使用前面提到的Citus进行横向扩展。
丰富的索引
Postgres现在有很多种强大的索引,像GIN 和GiST索引,它们对JSONB数据特别有用。我们现在也有了KNN 和Sp-GiST索引格式,并且还在增加中。
Upsert功能
Upsert在Progress已开发和演变有好几年了。当然,一些用户可以通过变通使用CTE功能来实现类似功能,但可能会产生一些条件冲突。这个特性曾是MySQL有但Postgres没有的功能,现在1年多前,Postgres也有了正式的支持。
外部数据源封装
当然,还有几年前就有的外部数据源封装功能。它允许你映射外部数据系统至Postgres中的表。这就意谓着,比如,我们可以在Postgres中查询Redis的数据库。这项功能5年前就一直在不断地改进和提高,尤其是现在我们已支持可写的外部数据源处理,即我们在Postgres直接写入数据至外部数据库。现在官方的Postgres发布版本中至少带有Postgres的FDW,它对跨Postgres实例读写数据尤其有用。
更多其他的功能
如果你对以前的PG版本不是太熟,在以前的版本中一些应了解的功能还包括:
窗口函数
一般函数
可定制的语言
NoSQL 数据类型
定制函数
CTE表达式
并行索引创建
事务DDL
外部数据封装
条件或函数式索引
事件侦听/提醒
表继承
事务级的同步复制
推荐:PostgreSQL教程