目录
PostgreSQL
PostgreSQL 起源于加州大学伯克利分校计算机系,最初设想于 1986 年,当时叫做 Berkley Postgres Project。1995 年,开发者 Andrew Yu 和 Jolly Chen 在 Postgres 中添加了一个 SQL 翻译程序,并在开源社区发布,称为 Postgres95。1996 年,开发者再次对 Postgres95 做了较大的改动,并将其作为 PostgresSQL 6.0 版正式发布。
- Github:https://github.com/postgres/
- 官方网站:https://www.postgresql.org/
- 中文社区:http://www.postgres.cn/index.php
- PostgreSQL 12.2 手册:http://www.postgres.cn/docs/12/index.html
PostgreSQL 是一个纯粹的、由社区驱动的开源软件,被称为世界上功能最强大的对象关系型数据库管理系统(ORDBMS)。也就是说 PostgreSQL 同时兼具关系型数据库和非关系型数据库的特性。自从 MySQL 被 Oracle 收购以后,PostgreSQL 逐渐成为了开源关系型数据库的首选。
特性
数据类型
- 基本类型:Integer、Numeric、String、Boolean
- 结构类型:Date/Time、Array、Range、UUID
- 文档类型:JSON/JSONB、XML、HStore(Key-value)
- 几何类型:Point、Line、Circle、Polygon
- 自定义类型:Composite、Custom Types
完整性约束
- 主键约束:实体完整性
- 外键约束:参照完整性
- 数据唯一约束,非空约束:用户定义完整性
- 排除约束
- 显式锁定、咨询锁定
并发性、性能
- PostgreSQL 服务器可以处理来自客户端的多个并发请求。 因此,它为每个连接 forks 一个新的进程。
- 索引:用户可以自定义索引,或使用内置的 B 树,哈希表与 GiST 索引。
- 复杂的查询优化器
- 查询的并行化
- 多版本并发控制:PostgreSQL 使用 MVCC(Multiversion concurrency control,多版本并发控制)系统进行并发控制,该系统向每个用户提供了一个数据库的 “快照”,用户在事务内所作的每个修改,对于其他的用户都不可见,直到该事务成功提交。
- 表分区
- SQL 标准中定义的所有事物隔离级别,包括 Serializable
- 即时表达式汇编(JIT)
- 面向 NUMA 多处理器架构
可靠性
PostgreSQL 的稳定性极强,Innodb 等引擎在崩溃、断电之类的灾难场景下抗打击能力很好。
- 预写日志(WAL)
- 数据复制(异步,同步,逻辑):对于 Web 应用来说,复制的特性很重要,PostgreSQL 可以做到同步,异步,半同步复制。PostgreSQL 的复制基于 WAL,可以做到同步复制。同时 PostgreSQL 还提供 stream 复制。
- 时间点恢复
- 主动备用
- 表空间
- 支持多种集群架构:plproxy 可以支持语句级的镜像或者分片,slony 可以进行字段级的同步设置,standby 可以构建 WAL 文件级或者流式的读写分离集群,同步频率和集群策略调整方便,操作非常简单。
可扩展性
PostgreSQL 有极其强悍的 SQL 编程能力,有丰富的统计函数和统计语法支持,比如分析函数,还可以用多种语言来编写存储过程。
- 自定义数据类型
- 自定义函数:通过函数,可以在数据库服务器端执行指令程序。
- 自定义操作符
- 自定义聚集函数
- 自定义索引方法
- 自定义存储过程:支持多种语言来写存储过程和程序,例如:PL/PGSQL、Perl、Python 等。
- 外部数据包装器:使用标准 SQL 接口连接到其他数据库或流(Stream)
- 触发器:触发器是由 SQL 语句查询所触发的事件,本质是数据库的回调函数。如:一个 INSERT 语句可能触发一个检查数据完整性的触发器。触发器通常由 INSERT 或 UPDATE 语句触发。
- 数据仓库:能平滑迁移至同属 PostgreSQL 生态的 GreenPlum,DeepGreen,HAWK 等,使用 FDW 进行 ETL。
安全性
- 身份验证方式:GSSAPI、SSPI、LDAP、SCRAM-SHA-256、证书等。
- 强大的访问控制系统
- 列和行级安全性
国际化,文本搜索
PostgreSQL 的 SQL 语法内置正则表达式,可以索引,还可以全文检索,或使用 xml xpath。用 PostgreSQL 的话,文档数据库就可以省略了。
- 支持国际字符集
- 全文检索:通过 Tsearch2 或 OpenFTS,8.3 版本中内嵌 Tsearch2。