PostgreSQL vs MySQL
就目前来说,整个开源的关系型数据库分成了两大派系。一个就是以PostgreSQL为主的这个派系,另外一个就是以MySQL为主的派系,这两者在世界上用的人数都是非常多的。在2023年,PostgreSQL的受欢迎的程度已经超过了MySQL。
这里我们就要对比一下,为什么PostgreSQL的成长速度会这么快?究竟底层有哪些特性给予了支撑呢?
PostgreSQL vs. MySQL 是在选择开源关系型数据库管理系统时的重要决策。PostgreSQL 和 MySQL 都是经过时间验证的解决方案,可以与企业级解决方案(如 Oracle 和 SQL Server)竞争。
MySQL 因其易用性和速度而闻名,而 PostgreSQL 则拥有更多高级功能,这也是 PostgreSQL 经常被描述为开源版 Oracle 的原因。
下表对比了 PostgreSQL 和 MySQL 的特性:
| 对比项 | PostgreSQL | MySQL |
|---|---|---|
| 别称 | 世界上最先进的开源数据库 | 世界上最流行的开源数据库 |
| 开发模式 | PostgreSQL是一个开源项目 | MySQL是一个开源产品 |
| 发音 | post gress queue ell | my ess queue ell |
| 许可证 | MIT风格许可证 | GNU通用公共许可证 |
| 实现语言 | C语言 | C/C++ |
| GUI工具 | PgAdmin | MySQL Workbench |
| ACID特性 | 支持 | 支持 |
| 存储引擎 | 单一存储引擎 | 多个存储引擎(如InnoDB和MyISAM) |
| 全文搜索 | 支持 | 支持(有限) |
| 删除临时表 | DROP TABLE语句不支持TEMP或TEMPORARY关键字 | 支持DROP TABLE语句中的TEMP或TEMPORARY关键字,仅允许删除临时表 |
| DROP TABLE | 支持CASCADE选项来删除表的依赖对象(如表和视图) | 不支持CASCADE选项 |
| TRUNCATE TABLE | 支持更多特性如CASCADE、RESTART IDENTITY、CONTINUE IDENTITY、事务安全等 | 不支持CASCADE和事务安全(即数据删除后无法回滚) |
| 自增列 | SERIAL | AUTO_INCREMENT |
| 标识列 | 支持 | 不支持 |
| 分析函数 | 支持 | 不支持(MySQL 8支持) |
| 数据类型 | 支持多种高级类型,如数组、hstore和用户定义类型 | SQL标准类型 |
| 无符号整数 | 不支持 | 支持 |
| 布尔类型 | 支持 | 内部使用TINYINT(1)表示布尔类型 |
| IP地址数据类型 | 支持 | 不支持 |
| 列默认值设置 | 未提及 | 必须是常量,或TIMESTAMP/DATETIME列的CURRENT_TIMESTAMP |
| CTE(公用表表达式) | 支持 | 支持(自MySQL 8.0起) |
| EXPLAIN输出 | 更详细 | 较简单 |
| 物化视图 | 支持 | 不支持 |
| CHECK约束 | 支持 | 支持(自MySQL 8.0.16起;此前MySQL会忽略CHECK约束) |
| 表继承 | 支持 | 不支持 |
| 存储过程编程语言 | Ruby、Perl、Python、TCL、PL/pgSQL、SQL、JavaScript等 | SQL:2003语法存储过程 |
| FULL OUTER JOIN | 支持 | 不支持 |
| INTERSECT | 支持 | 不支持 |
| EXCEPT | 支持 | 不支持 |
| 部分索引 | 支持 | 不支持 |
| 位图索引 | 支持 | 不支持 |
| 表达式索引 | 支持 | 不支持 |
| 覆盖索引 | 支持(自9.2版本起) | 支持。MySQL支持覆盖索引,允许仅通过扫描索引检索数据而无需访问表数据,这对包含数百万行的大表很有优势 |
| 触发器 | 支持在大多数命令类型上触发,除了影响数据库全局的对象(如角色和表空间) | 仅支持部分命令 |
| 分区 | RANGE、LIST | RANGE、LIST、HASH、KEY以及RANGE或LIST与HASH或KEY子分区的组合分区 |
| 任务调度 | PgAgent | 事件调度器 |
| 连接可扩展性 | 每个新连接是一个操作系统进程 | 每个新连接是一个操作系统线程 |
特性对比
PostgreSQL 和 MySQL 都作为关系型数据库管理系统提供了广泛的功能,但两者之间存在一些关键差异:
数据类型:PostgreSQL 支持更广泛的高级数据类型,包括数组、hstore(键值存储)和 JSONB(二进制 JSON)。另一方面,MySQL 的数据类型集合较为有限,更适用于简单的 Web 应用程序。MySQL 的 JSON 二进制存储格式可以与 PostgreSQL 的 JSONB 进行比较。实际上,MySQL 的 JSON 存储非常适合简单的 JSON 结构和直接的 Web 应用程序(日常应用中,如果是相对简单的处理,MySQL是胜任的)。
地理空间支持:PostgreSQL 强力支持地理空间数据,包括用于处理地理数据的丰富的数据类型、函数和操作符。MySQL 在地理空间支持方面虽有一些功能,但在这个领域可能还需要更多的改进。
索引:在 MySQL 中,默认的索引类型是 B-tree,非常适合大多数使用情况。PostgreSQL 比 MySQL 拥有更为精细的索引系统,包括对 B-tree、GiST(广义搜索树)和 GIN(广义反向索引)索引的支持。这些提供了更多优化查询性能和数据检索的选项(索引是我认为PG更受欢迎的一个非常重要的原因。)。
复制:PostgreSQL 和 MySQL 都支持主从数据库复制,但复制的方法和选项有所不同。PostgreSQL 支持使用第三方扩展实现多主复制。MySQL 最近引入了一种名为 Group Replication 的新的复制模型,但它仍然是一个相对较新的功能,有一些限制。
事务:PostgreSQL 和 MySQL InnoDB 都使用 MVCC(多版本并发控制)来处理并发数据访问。然而,PostgreSQL 提供了更先进的事务管理功能,如事务隔离级别、原子事务和保存点。相比之下,MySQL 的事务管理选项较为有限。对于需要高并发或复杂事务逻辑的应用程序,PostgreSQL 可能更加合适。
存储过程:PostgreSQL 和 MySQL 都支持存储过程,但存储过程的语言和功能有所不同。PostgreSQL 支持使用多种语言编写存储过程,包括 PL/pgSQL、PL/Tcl、PL/Perl 等。而 MySQL 主要支持使用 SQL 编写存储过程。
扩展:PostgreSQL 拥有一个强大的扩展框架,允许开发人员添加自定义功能并扩展数据库的核心特性。虽然 MySQL 对扩展有一定支持,但与 PostgreSQL 相比,其扩展性有所不同。
数据变更捕捉
变更数据捕获(Change Data Capture,CDC)方面,MySQL 二进制日志和 PostgreSQL 预写日志(Write-Ahead Logs,WAL)都可以捕获对数据库所做的更改。然而,CDC 的具体特性和用法可能会有所不同。
DBConvert Streams 是一款软件,可以读取 MySQL 和 PostgreSQL 事务日志,并将记录转换为另一种方言,从而适用于实时异构数据库复制。
它们虽然实现的细节不同,但是大的方向也都是基于日志的方式来记录我们做了什么事儿。
性能
MySQL 以其高性能和处理大量数据的能力而闻名。它经过优化,适用于读密集型工作负载,并具有快速的索引系统,有助于提高查询性能。然而,当与写操作结合时,可能会出现并发问题,如锁争用,导致性能下降。 InnoDB 存储引擎用于解决表级别锁问题。它是 MySQL 生态系统中最受欢迎和广泛使用的存储引擎之一。
InnoDB 支持行级别锁定,提高了混合工作负载的并发性。此外,近期开发的高性能存储引擎 MyRocks 进一步提高了 MySQL 处理写入密集型工作负载的能力。
PostgreSQL 的设计更加多样化,可以处理读密集型和写密集型的工作负载,但相对于针对读密集型工作负载进行优化的 MySQL,性能略低。然而,PostgreSQL 在最近的版本中改进了性能,特别是在处理复杂查询和数据处理方面。
此外,与 MySQL 相比,PostgreSQL 具有更先进的索引系统,可以提高复杂查询的性能。PostgreSQL 还支持高级数据类型,如数组和 JSONB,可以实现更高效的数据存储和检索。 (简单总结一下,PG相比MySQL来说,它有更先进的检索引擎,所以更适合复杂场景。但是如果是简单的数据提取的话,MySQL效率会更高一点,仅仅是一点)
可扩展性
MySQL 和 PostgreSQL 都可以进行扩展,但在可扩展性方面它们具有不同的优势和劣势。
MySQL 常常被人们喜欢是因为其水平可扩展性,也就是说可以通过向数据库集群添加更多节点来进行横向扩展。它非常适合需要处理大量并发连接的 Web 应用程序。
另一方面,PostgreSQL 以其垂直可扩展性而闻名,也就是说可以通过向单个节点添加更多资源(如内存和 CPU)来处理大量数据和处理能力。它还通过分片等技术支持水平扩展,允许将大型数据集分割到多个节点上。PostgreSQL 更适合需要复杂查询和事务以及数据仓库和商业智能工作负载的应用程序。
在考虑可扩展性时,要考虑您的应用程序的具体要求。如果您需要处理大量并发连接并需要水平可扩展性,那么 MySQL 可能是一个更好的选择。然而,如果您需要复杂的事务和查询,那么 PostgreSQL 可能更合适。
成本
在2023年,PostgreSQL仍然是完全开源和由社区驱动的,而MySQL在许可方面有更复杂的历史。MySQL最初是由MySQL AB开发的商业产品,提供免费和付费版本。2010年,Oracle收购了MySQL AB,这引发了开发人员对其开源状态的未来的一些担忧。然而,一些原始MySQL的开源分支,包括MariaDB和Percona,已经帮助缓解了这些担忧。
PostgreSQL的问题
- 尽管PostgreSQL具有先进的特性和功能,但它尚未达到MySQL的普及程度和广泛使用。这导致了第三方工具数量较少
- 以及PostgreSQL生态系统中经验丰富的开发人员或数据库管理员数量较少。由于其先进的特性,相对于MySQL,设置和管理PostgreSQL可能更复杂,更适合有经验的数据库管理员和开发人员。
- 由于其更复杂的架构和特性,PostgreSQL在某些使用情况下可能比MySQL更慢。
- PostgreSQL可能需要比MySQL更多的资源,特别是在内存和CPU使用方面。
- 尽管PostgreSQL是开源的,但由于其先进的特性和增加的资源需求,实施和维护的成本仍然可能很高。对于每个新的客户端连接,PostgreSQL都会分叉一个新的进程,这可能会分配大量的内存,通常每个连接约为10 MB。然而,这种架构的设计旨在提供更好的性能、可靠性和可扩展性之间的安全性和隔离性权衡。
- PostgreSQL的设计注重可扩展性、标准符合性、可扩展性和数据完整性。有时,这些特性与MySQL相比可能会降低性能,特别是在简单的读密集型工作负载中。