PostgreSQL主要功能介绍

404 阅读6分钟

你应该知道的PostgreSQL的主要功能

在对你的项目的数据库架构做决定时,了解PostgreSQL的主要功能是非常重要的。

如果你已经熟悉了其他SQL数据库,但对PostgreSQL还很陌生,那么这篇文章就很适合你。它将帮助你了解其中的细微差别,并开始使用PostgreSQL。

注意:本文中的大多数比较都是针对MySQL的,因为它是最接近PostgreSQL的开源数据库,可以与之比较。

在主键上没有默认排序

如果你以前使用过MySQL,那么你应该熟悉这样一个事实:任何表的主键默认都是一个聚类键。数据在磁盘上使用索引进行物理排序,这就是为什么在MySQL中查询主键时,在查询中没有order by ,数据会被排序。

MySQL

让我们通过运行下面的查询,用一些实验来测试我们的理论。

-- Create table E1
CREATE TABLE E1 (
  empId INTEGER,
  name TEXT NOT NULL,
  dept TEXT NOT NULL
);

-- Insert sample values
INSERT INTO E1 VALUES (0001, 'John', 'Sales');
INSERT INTO E1 VALUES (0003, 'Ava', 'Sales');
INSERT INTO E1 VALUES (0002, 'Dave', 'Accounting');

-- Select without Order By
SELECT * FROM E1;

现在,让我们创建一个主键。

-- Add Primary key. This is clustered by default
ALTER TABLE E1 ADD PRIMARY KEY (empID);

正如你所看到的,我们在查询中没有包括order by 子句,但MySQL仍然以相同的顺序返回行。

PostgreSQL

让我们在PostgreSQL 中运行同样的一组查询,只是在一个有主键的表中。

-- Similar code to MySQL. Create table and insert sample values.
-- Primary key is added in the Create itself.
CREATE TABLE E1 (
  empId INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  dept TEXT NOT NULL
);

INSERT INTO E1 VALUES (0001, 'John', 'Sales');
INSERT INTO E1 VALUES (0003, 'Ava', 'Sales');
INSERT INTO E1 VALUES (0002, 'Dave', 'Accounting');

如果我们运行像SELECT * (见下文)这样的查询,PostgreSQL不会按empId ,我们必须包含一个ORDER BY 子句来代替。

聚类键有其自身的优点和缺点,但是在PostgreSQL中没有默认的聚类键。不过,如果需要的话,PostgreSQL可以让你选择做聚类

ACID兼容的差异

PostgreSQL有默认的ACID兼容设置,这些设置在本质上是非常不同和严格的。其中一些是如下的。

脏读

PostgreSQL默认有更严格的ACID规范。例如,MySQL有一个隔离级别(Read Uncommitted),允许脏读发生,而在PostgreSQL中,没有允许脏读的版本/级别。

可序列化

为了完成可序列化的隔离级别(最强级别),PostgreSQL使用了一种叫做基于内存的MVCC。这要快得多,而且通常不需要显式锁来实现可序列化的水平。相比之下,MySQL是通过细粒度的锁来实现的。在大多数情况下,没有性能差异,但有人认为,基于内存的MVCC稍好一些,可以防止主表的膨胀。

连接是昂贵的

PostgreSQL遵循基于进程的并发性,因此不鼓励打开和关闭连接。这也是许多其他数据库系统的情况,但在PostgreSQL中更加如此。因此,我们建议使用一个连接池,它可以在较长时间内保持连接,然后应用程序可以通过这个连接池打开和关闭连接。

PostgreSQL不是一个单一模式的数据库

PostgreSQL的用户还应该注意,PostgreSQL不是一个单一模式的数据库。它将其他的数据库模式/类型无缝地集成到关系模型的操作中。 这些数据类型也有它们自己独特的索引类型,以加快访问速度。不像MySQL有不同的引擎,PostgreSQL使用相同的引擎工作,只有数据类型和索引类型不同。

数据库与模式

在PostgreSQL中,数据库与其他数据库是完全分开的。在一个PostgreSQL集群中只保留一个数据库是一个好的做法。如果有必要对表进行逻辑分组,那么这就是模式的作用:

  • 一个PostgreSQL数据库与其他数据库是严格分开的。一个数据库连接总是被打开到集群中的一个数据库。这个连接不能被重用来连接其他数据库,即使是在同一个集群中。
  • 集群资源在同一集群中的不同数据库之间平等共享。
  • 模式可以在不同的数据库连接之间重复使用,并代表一个逻辑的表的集合。
  • 数据备份和恢复通常在数据库层面上工作,所有的模式都是自成一体的。

这些要点是很重要的,特别是对于那些来自MySQL这样的数据库的人来说,这些术语是相反的。

方言的差异

由于许多原因,每个数据库都有自己的SQL方言。PostgreSQL有自己的方言,它非常接近ANSI SQL标准。SQL词汇表列在这里的文档中

开源和社区拥有

开源和社区拥有是两件非常不同的事情。开放源码描述了软件的许可证,比如说

  • Apache。
  • BSD。
  • MIT。
  • GPL。

等。

和社区拥有意味着进化、发展和提高的方向是由志愿者社区决定的。一个社区拥有的开源软件比一个组织拥有的开源软件要好得多,因为没有公司决定项目的未来。PostgreSQL有一个类似于BSD或MIT的许可证,比GPL(MySQL许可证)要允许得多。 对于所有的实际使用情况,人们不需要担心PostgreSQL的许可证对他们的大部分工作的影响。

没有多少关系型数据库能满足以下三条戒律:

  • 该数据库像PostgreSQL一样是开源的(自由的许可。)
  • 该数据库是社区拥有的。
  • 该数据库具有广泛的用户基础和采用。

对我来说,这是PostgreSQL数据库的最大优势之一。

在这篇博客中,我们已经介绍了PostgreSQL提供的一些功能,这些功能是其他数据库管理系统如MySQL没有提供的。
如果我们进一步将PostgreSQL与MySQL和其他数据库管理系统进行比较,我们会注意到有几个更微妙的区别,包括但不限于:

  • PostgreSQL中的真空与MySQL中的清除。
  • PostgreSQL中的进程vs.MySQL中的线程。(MySQL使用线程)
  • 表的继承,这在PostgreSQL中存在,但在MySQL中不存在。

还有很多。重要的是要了解你所选择的任何功能将如何影响你的数据库基础设施,因为数据库管理系统是为各种各样的使用情况而开发的。但要避免仅仅为了比较而比较功能--这些数据库管理系统已经存在了很长时间,新功能的添加非常频繁,而且路线图也在快速变化。

就PostgreSQL而言,请记住,虽然它有自己的缺点,但它被认为是当今最先进的开源数据库管理系统之一,可供使用。作为软件工程师,我们有责任了解数据库管理系统所带来的所有权衡,并做出合理的决定。我们希望这篇文章能让你对PostgreSQL中的内容有更多的了解,从而让你做出明智的决定。