网络知识 娱乐 告诉你开源数据库PostgreSQL比mysql强在那里

告诉你开源数据库PostgreSQL比mysql强在那里

本文将告诉你PostgreSQL有哪些强大的功能你需要了解的:

主键没有默认排序

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

MySQL

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

-- Create table E1nCREATE TABLE E1 (n empId INTEGER,n name TEXT NOT NULL,n dept TEXT NOT NULLn);nn-- Insert sample valuesnINSERT INTO E1 VALUES (0001, 'John', 'Sales');nINSERT INTO E1 VALUES (0003, 'Ava', 'Sales');nINSERT INTO E1 VALUES (0002, 'Dave', 'Accounting');nn-- Select without Order BynSELECT * FROM E1;告诉你开源数据库PostgreSQL比mysql强在那里

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

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


告诉你开源数据库PostgreSQL比mysql强在那里

如您所见,我们的查询中没有包含order by子句,但 MySQL 仍然以相同的顺序返回行。

PostgreSQL

让我们在 中运行相同的查询集PostgreSQL,仅在具有主键的表上:

-- Similar code to MySQL. Create table and insert sample values.n-- Primary key is added in the Create itself.nCREATE TABLE E1 (n empId INTEGER PRIMARY KEY,n name TEXT NOT NULL,n dept TEXT NOT NULLn);nnINSERT INTO E1 VALUES (0001, 'John', 'Sales');nINSERT INTO E1 VALUES (0003, 'Ava', 'Sales');nINSERT INTO E1 VALUES (0002, 'Dave', 'Accounting');


如果我们运行类似SELECT *(见下文)的查询,PostgreSQL 将不会对数据进行排序empId- 我们必须包含一个ORDER BY子句。

告诉你开源数据库PostgreSQL比mysql强在那里

告诉你开源数据库PostgreSQL比mysql强在那里

聚簇键各有优缺点,但 PostgreSQL 中没有默认的聚簇键。不过,如果需要,PostgreSQL 可以让您选择进行集群。

ACID 合规性差异

PostgreSQL 具有默认的 ACID 合规性设置,这些设置在本质上非常不同且更严格。其中一些如下:

脏读

默认情况下,PostgreSQL 具有更严格的 ACID 合规性。例如,MySQL 具有允许脏读发生的隔离级别(未提交读),而在 PostgreSQL 中,没有允许脏读的版本/级别。

可序列化

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

连接成本高昂

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

PostgreSQL 不是单一模型数据库

PostgreSQL 的用户还应该注意,PostgreSQL 不是单一模型数据库。它将其他数据库模式/类型无缝集成到操作的关系模型中。

这些数据类型也有自己独特的索引类型,可以更快地访问。与具有不同引擎的 MySQL 不同,PostgreSQL 使用相同的引擎工作,只有数据类型和索引类型不同。

数据库与架构

在 PostgreSQL 中,一个数据库与其他数据库完全分离。在 PostgreSQL 集群中只保留一个数据库是一种很好的做法。如果需要对表进行逻辑分组,那么这就是模式的用武之地。

  • PostgreSQL 数据库与其他数据库严格分开。数据库连接始终打开到集群中的一个数据库。即使在同一个集群中,该连接也不能用于连接其他数据库。
  • 集群资源在同一集群中的不同数据库之间平等共享。
  • 模式可以在不同的数据库连接之间重用,并表示表的逻辑集合。
  • 数据备份和恢复通常在数据库级别进行,所有模式都是自包含的。

理解这些要点很重要,尤其是对于来自 MySQL 等数据库的人来说,这些术语是颠倒的。

方言差异

出于多种原因,每个数据库都有自己的 SQL 方言。PostgreSQL 有自己的方言,非常接近 ANSI SQL 标准。SQL 词汇表在此处的文档中列出。

如果我们进一步将 PostgreSQL 与 MySQL 和其他数据库管理系统进行比较,我们会注意到还有一些更细微的差异,包括但不限于:

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

还有更多。重要的是要了解您选择使用的任何功能将如何影响整个数据库基础架构,因为数据库管理系统已针对各种用例开发。但是,避免仅仅为了比较而比较特性——这些数据库管理系统已经存在了很长时间,新特性的添加非常频繁,而且路线图也在迅速变化。

就 PostgreSQL 而言,请记住,虽然它有自己的缺点,但它被认为是当今可用的最先进的开源数据库管理系统之一。