九月 16, 2023
在选择开源关系数据库管理系统时,PostgreSQL 与 MySQL 是一个重要的决定。PostgreSQL 和 MySQL 都是经过时间验证的解决方案,可以与 Oracle 和 SQL Server 等企业解决方案竞争。
MySQL 以其易用性和速度而闻名,而 PostgreSQL 则拥有许多更高级的功能,这就是 PostgreSQL 经常被描述为 Oracle 的开源版本的原因。
下表比较了 PostgreSQL 与 MySQL 的功能:
PostgreSQL | MySQL | |
---|---|---|
口号 | 世界上最先进的开源数据库。 | 世界上最受欢迎的开源数据库。 |
开发 | PostgreSQL 是一个开源项目。 | MySQL 是一个开源产品。 |
发音 | post gress queue ell | my ess queue ell |
许可 | BSD 风格的许可证 | GNU 通用公共许可证 |
实现编程语言 | C | C/C++ |
图形用户界面工具 | PgAdmin | MySQL Workbench |
ACID | 支持 | 支持 |
存储引擎 | 单一存储引擎 | 多种存储引擎,例如 InnoDB 和 MyISAM |
全文检索 | 支持 | 支持(有限) |
删除临时表 | DROP TABLE 语句中没有TEMP 或者TEMPORARY 关键字 |
DROP TABLE 语句中支持TEMP 或TEMPORARY 关键字,允许只删除临时表 |
DROP TABLE | 支持带CASCADE 选项删除表的依赖对象,例如表和视图 |
不支持CASCADE 选项 |
TRUNCATE TABLE | PostgreSQL 的TRUNCATE TABLE 支持更多功能,如CASCADE 、RESTART IDENTITY 、CONTINUE IDENTITY 、事务安全等。 |
MySQL 的TRUNCATE TABLE 不支持CASCADE 和事务安全。数据一旦删除,就无法回滚。 |
自动递增列 | SERIAL | AUTO_INCREMENT |
标识列 | 支持 | 不支持 |
分析函数 | 支持 | 不支持 |
数据类型 | 支持许多高级类型,例如 array、hstore 和用户定义类型。 | SQL 标准类型 |
无符号整数 | 不支持 | 支持 |
布尔类型 | 支持 | 内部使用TINYINT(1) 实现布尔值 |
IP 地址数据类型 | 支持 | 不支持 |
设置列的默认值 | 默认值同时支持常量和函数调用 | 默认值必须是常量,对于TIMESTAMP 或DATETIME 类型的列也可以使用CURRENT_TIMESTAMP |
CTE | 支持 | 支持(从 MySQL 8.0 开始支持 CTE) |
EXPLAIN 输出 |
更详细 | 不太详细 |
物化视图 | 支持 | 不 |
检查约束 | 支持 | 支持(从 MySQL 8.0.16 开始支持,在此之前 MySQL 只是忽略 CHECK 约束) |
表继承 | 支持 | 不支持 |
存储过程的编程语言 | Ruby、Perl、Python、TCL、PL/pgSQL、SQL、JavaScript 等 | SQL:2003 存储过程语法 |
FULL OUTER JOIN | 支持 | 不支持 |
INTERSECT | 支持 | 不支持 |
EXCEPT | 支持 | 不支持 |
部分索引 | 支持 | 不支持 |
位图索引 | 支持 | 不支持 |
表达指标 | 支持 | 不支持 |
覆盖索引 | 支持(自 9.2 版本起) | 支持。MySQL支持覆盖索引,允许仅通过扫描索引来检索数据,而不需要接触表数据。这对于具有数百万行的大型表来说是有利的。 |
触发器 | 支持可以在大多数类型的命令上触发的触发器,但影响实例级数据库对象的命令除外,例如角色和表空间。 | 仅限于某些命令 |
分区 | 范围、列表 | 范围、列表、HASH、KEY 以及使用范围或列表与 HASH 或 KEY 子分区组合的复合分区 |
任务调度 | pgAgent | 调度事件 |
连接扩展性 | 每个新连接都是一个操作系统进程 | 每个新连接都是一个操作系统线程 |