前言
最近在各大招聘要求或者技术博客中,总有看到Postgres/PG/PostgreSQL这些词,一眼下去完全不知道是什么来的,冲浪一下发现这也是一个类似MySQL的开源数据库,同时近年来在国外还不断在变得流行起来,通过下图的排名可以看到PostgreSQL已经连续几个季度在受欢迎程度第4名了。
那么下面就去了解一下这是啥东东O(∩_∩)O
PS:Postgres(历史叫法)、PostgreSQL(官方全称)、PG(缩写)指的都是同一个东西
在去了解之前我有如下疑问
- PostgreSQL是什么?
- PostgreSQL和MySQL有什么区别?
- 为什么感觉PostgreSQL听得比较少?是最近才开发出来的吗?
- 如何使用PostgreSQL?
PostgreSQL是什么?
from GPT
PostgreSQL是一个高度先进的开源关系数据库管理系统(RDBMS)。它的发展始于1986年,最初作为加州大学伯克利分校计算机系的一个项目,后来发展成为一个全面支持SQL语言的数据库系统,并且随着时间的推移,它已经发展成为一个功能丰富、性能卓越、支持高度可扩展性的数据库解决方案。PostgreSQL广泛用于从小型应用到大型互联网应用以及数据仓库等多种场合。
核心特性
PostgreSQL的核心特性包括但不限于以下几点:
- 复杂的查询能力:PostgreSQL支持复杂的查询(如子查询、连接等),提供了强大的数据检索能力。
- 数据完整性:支持主键、外键、唯一约束和检查约束等多种数据完整性约束,确保数据的准确性和一致性。
- 事务和并发控制:支持ACID(原子性、一致性、隔离性、持久性)事务模型。通过MVCC(多版本并发控制)机制,优化并发性能,减少锁的争用。
- 高度可扩展:可以通过增加更多的硬件资源来扩展系统的性能和容量,同时支持分区表、复制等功能,提高数据处理能力和高可用性。
- 支持多种编程语言:提供了丰富的API,支持C/C++、Java、Python、Perl、Ruby等多种编程语言的接口。
- 高级索引:支持B树、GiST(通用搜索树)、GIN(通用倒排索引)等多种索引类型,以及全文搜索等高级功能。
- 扩展性:提供了存储过程、自定义函数、自定义数据类型等机制,允许用户根据需要扩展数据库功能。
- 安全性:支持SSL加密连接、角色基础的权限管理等多种安全机制,保证数据的安全性。
应用场景
PostgreSQL因其高度的灵活性和功能丰富性,被广泛应用于多种场景,如:
- Web应用:作为后端数据库存储Web应用的数据。
- GIS系统:通过PostGIS扩展,PostgreSQL成为存储和查询地理空间数据的理想选择。
- 数据仓库:因其优秀的并发控制和查询优化能力,适合用作数据仓库,处理大量数据的存储和分析。
- 金融系统:其事务处理的可靠性和数据完整性特性,使其成为金融系统中存储关键数据的可靠选择。
社区和发展
PostgreSQL拥有一个活跃的开源社区,不断有来自世界各地的开发者为其贡献代码,推出新的功能。社区提供的丰富文档、教程和支持是PostgreSQL得以持续发展和改进的重要保障。此外,也有众多公司和组织提供专业的PostgreSQL商业支持和咨询服务,以满足企业级应用的需求。
总之,PostgreSQL是一个功能强大、高度可定制和扩展的数据库系统,适合用于各种规模和类型的项目。
总结一下就是PostgreSQL是一个开源、对象关系数据库管理系统(ORDBMS)、支持多种复杂查询、事务完整性、多版本并发控制、强大扩展性、多种数据类型。
PostgreSQL和MySQL的区别
类别 | MySQL | PostgreSQL |
---|---|---|
数据库技术 | MySQL 是一个纯粹的关系数据库管理系统。 | PostgreSQL 是一个对象关系数据库管理系统。 |
功能 | MySQL 对视图、触发器和过程等数据库功能提供有限支持。 | PostgreSQL 支持大多数高级数据库功能,例如实体化视图、INSTEAD OF 触发器和多种语言的存储过程。 |
数据类型 | MySQL 支持数字、字符、日期和时间、空间和 JSON 数据类型。 | PostgreSQL 支持所有 MySQL 数据类型,以及几何、枚举、网络地址、数组、范围、XML、hstore 和组合。 |
ACID 合规性 | MySQL 仅针对 InnoDB 和 NDB 集群存储引擎具有 ACID 兼容性。 | PostgreSQL 始终符合 ACID。 |
索引 | MySQL 支持 B 树和 R 树索引。 | PostgreSQL 支持多种索引类型,例如表达式索引、部分索引和带有树的哈希索引。 |
性能 | MySQL 提高了高频读取操作的性能。 | PostgreSQL 提高了高频写入操作的性能。 |
初学者支持 | MySQL 更容易入门。它为非技术用户提供了更广泛的工具集。 | PostgreSQL 的入门比较复杂。它为非技术用户提供的工具集有限。 |
可以看到PostgreSQL相对于MySQL提供了更多的特性和功能,同时也支持多种数据类型,例如:几何、数组、JSONB、XML等。在索引上也有GIN索引、B-树索引、哈希索引、GiST索引、Bloom过滤器索引等。
为什么感觉PostgreSQL听得比较少?
通过一波网络冲浪,总结下来主要是两个原因,学习成本和使用成本比较大
- 对于国内大部分公司或者开发者来说,项目中都使用不到PostgreSQL的高级特性,例如JSONB、数组、几何等数据类型,常用的int、varchar、datetime已经足够使用。
- PostgreSQL强大的索引类型,例如倒排索引、全文索引、空间索引,在各种后台系统、CRUD项目中也用不着,只对几个关键列建个B树索引就够用了。就算需要使用到全文搜索、时序之类的,也更倾向于使用专门领域的组件,例如ElasticSearch、Prometheus等。
- PostgreSQL对高并发支持良好,但使用的是多进程模式,这就导致进程创建会比较慢、同时占用内存会比较多。
- 以前项目都是大部分都是OLMP一把嗦,即Apache加MySQL加PHP,同时MySQL又开箱即用,对服务器要求不高,导致大部分开发者接触的第一个数据库就是MySQL,那就会不断影响传递,”祖传代码”就出来了,毕竟能跑就行。
安装
PostgreSQL支持多种系统,例如Linux、MacOS、WIndows都是支持的,下面是MacOS的一种安装方式。
1 | // 使用brew安装 |
基础操作
由于PostgreSQL和MySQL都是遵循SQL标准的关系型数据库管理系统(RDBMS),所以他们的大致语法操作都差不多,下面就简单试一试。
1 | // 创建数据库 |
常见数据类型
数字类型
名字 | 存储尺寸 | 描述 | 范围 |
---|---|---|---|
smallint | 2字节 | 小范围整数 | -32768 to +32767 |
integer | 4字节 | 整数的典型选择 | -2147483648 to +2147483647 |
bigint | 8字节 | 大范围整数 | -9223372036854775808 to +9223372036854775807 |
decimal | 可变 | 用户指定精度,精确 | 最高小数点前131072位,以及小数点后16383位 |
numeric | 可变 | 用户指定精度,精确 | 最高小数点前131072位,以及小数点后16383位 |
real | 4字节 | 可变精度,不精确 | 6位十进制精度 |
double precision | 8字节 | 可变精度,不精确 | 15位十进制精度 |
smallserial | 2字节 | 自动增加的小整数 | 1到32767 |
serial | 4字节 | 自动增加的整数 | 1到2147483647 |
bigserial | 8字节 | 自动增长的大整数 | 1到9223372036854775807 |
字符类型
名字 | 描述 |
---|---|
character varying(n), varchar(n) | 有限制的变长 |
character(n), char(n) | 定长,空格填充 |
text | 无限变长 |
时间类型
名字 | 存储尺寸 | 描述 | 最小值 | 最大值 | 解析度 |
---|---|---|---|---|---|
timestamp [ (p) ] [ without time zone ] | 8字节 | 包括日期和时间(无时区) | 4713 BC | 294276 AD | 1毫秒 / 14位 |
timestamp [ (p) ] with time zone | 8字节 | 包括日期和时间,有时区 | 4713 BC | 294276 AD | 1毫秒 / 14位 |
date | 4字节 | 日期(没有一天中的时间) | 4713 BC | 5874897 AD | 1日 |
time [ (p) ] [ without time zone ] | 8字节 | 一天中的时间(无日期) | 00:00:00 | 24:00:00 | 1毫秒 / 14位 |
time [ (p) ] with time zone | 12字节 | 仅仅是一天中的时间,带有时区 | 00:00:00+1459 | 24:00:00-1459 | 1毫秒 / 14位 |
interval [ fields ] [ (p) ] | 16字节 | 时间间隔 | -178000000年 | 178000000年 | 1毫秒 / 14位 |
布尔类型
名字 | 存储字节 | 描述 |
---|---|---|
boolean | 1字节 | 状态为真或假 |