导读:用PostgreSQL还是MySQL,现在似乎越来越不好选择。本文能给大家一个清晰的选型描述。
但是开发者的核心挑战是:如何管理两者之间安全访问的场景。
无论你的团队是使用 PostgreSQL 进行财务和分析,还是使用 MySQL 进行电子商务和仪表板管理,需要确保跨环境的一致、安全和可审计的访问都是现代技术团队的首要之关注点。
数据库管理系统是一种允许用户创建、管理和与数据库交互的软件系统。虽然PostgreSQL和 MySQL 都属于这一类,但它们在本质上是不同的。
MySQL是纯关系型数据库,它将简单性和速度放在首位。值得我们注意的是,新的JSON 支持赋予了它半结构化功能。
PostgreSQL 则更为复杂些,它是一个对象关系型数据库。由于其功能极其丰富且可扩展性较好,PostgreSQL 通常是处理复杂查询和写入密集型工作负载的首选。
下面,我们将用更详细地文字来介绍。
MySQL 虽然广受欢迎,但众所周知的是,它为了性能和易用性而在 SQL 兼容性方面做出了一些取舍。最近的版本虽然有了显著的改进,但仍然明显缺乏对一些高级 SQL 结构的支持。开发者在使用非 InnoDB 存储引擎时,这一点尤其明显。
可扩展性是 PostgreSQL 的核心能力。想要定义自定义数据类型、运算符、索引方法,甚至加载 PostGIS 等用于空间数据的扩展程序吗?在Postgre这里很容易。
相比之下,My SQL 的扩展性略差一些。虽然有插件,但创建和部署它们需要更深层次的内部知识,甚至可能限制你使用内置语法和存储引擎。
PostgreSQL 支持多种索引类型,包括如下:
MySQL 支持两种常见的索引:B 树和全文索引(例如,InnoDB 支持 FULLTEXT)。不过,后者可能存在一些限制,具体取决于所使用的存储引擎。
PostgreSQL 同时支持常规视图和物化视图。两者都是预先计算并存储的,以便快速读取。因为可以按需刷新,因此它们特别适合用于执行昂贵的连接或聚合操作。
至于 MySQL,它仅支持非物化访问,这表示着查询是在访问时执行的。
PostgreSQL 非常重视合规性,严格遵守ACID 原则(原子性、一致性、隔离性和持久性)。这意味着无论发生错误还是故障,PostgreSQL 都能提供完全的事务隔离。是的,即使是在最苛刻的软件用例中,例如金融系统、合规性要求严格的环境以及企业级审计跟踪,PostgreSQL 都能实现序列化。
MySQL 也支持使用 InnoDB 存储引擎的 ACID 事务。但是,它的 MyISAM 存储引擎并不兼容 ACID,如果切换过来,用户可能会感到困惑。MySQL 的默认配置更倾向于速度,而非严格的隔离性。
PostgreSQL 与 MySQL 的争论应该涵盖一些相互竞争的 DBMS 真正核心。
前者遵循基于进程的架构,每个连接都会生成一个新的操作系统进程。这听起来可能复杂,但 PostgreSQL 设计的优势在于它提供的稳定性。换句话说,错误的连接根本不会导致服务器崩溃。唯一的缺点是它需要大量的内存。
MySQL基于线程架构构,这能让它能够很好地扩展数千个轻量级连接。由于 MySQL 的设计减少了每个连接的内存消耗,因此它非常适合具有很多个并发用户的 Web 应用。
接下来,让我们来谈谈 MySQL 和 PostgreSQL 之间的主要区别。
在这里,MySQL 和 PostgreSQL 之间的区别非常微妙。PostgreSQL 要更胜一筹,因为它支持更广泛的数据类型,包括原生和自定义数据类型:
这是否意味着 MySQL 的选择有限?
事实并非如此,MySQL支持大多数常见类型(INT、VARCHAR、DATE 等),它在最近于 5.7 版本中也引入了 JSON类型。
即便如此,它在两个关键方面存在着不足:JSON索引 和原生支持数组的数据类型。
如果不深研究 PostgreSQL 和 MySQL 在查询方面的比较,那就太失礼了,这可以说是关系 DBMS 领域中最重要的方面。
PostgreSQL 使用功能强大、功能全面的查询规划器与优化器。该优化器支持从 CTE、窗口函数到自定义索引(例如 GIN、GiST、BRIN)的所有内容。
相比之下,MySQL 的查询优化器对于简单的查询效果非常好,并且受益于一致的模式使用。然而,随着表数据的增长,它可能会难以处理更复杂的连接。
简单来说,PostgreSQL 可以更好地处理复杂的分析工作负载,而 MySQL 最适合简单、简单的在线事务处理 (OLTP)。
两个操作系统都使用多版本并发控制(MVCC)。然而,它们的技术实现存在显著差异。
PostgreSQL 的 MVCC 非常健壮。它不仅支持细粒度的行级锁和快照隔离,还支持更高级的死锁控制和事务一致性。
MySQL 的 MVCC(通过 InnoDB)在撤消日志上蓬勃发展,但与同类产品相比,其隔离级别能力有限。
让我们对每个系统在负载下的表现进行基准测试,并讨论影响实际性能的因素。
就读写性能而言,MySQL 的速度非常快。它尤其适用于读取量大、查询量高、写入率低的应用,例如 CMS、论坛和仪表盘。
对于写入密集型工作负载,PostgreSQL 无疑是赢家。与 MySQL 相比,它在处理复杂事务、索引和触发器方面表现更佳。
与 MySQL 相比,PostgreSQL 的执行引擎和优化器在处理以下方面遥遥领先:
为了使 MySQL 达到类似的性能水平,通常需要非规范化或应用层解决方法。
由于 PostgreSQL 架构复杂,每个进程可能会消耗更多内存,但它的进程隔离机制弥补了这一点。怎么做到的?通过提升稳定性。
值得一提的是,MySQL 的内存占用非常小。这使得它非常适合资源有限的共享主机或容器。
本节中的功能定义了数据库如何支持现代开发需求。让我们看看它有哪些内置功能、哪些功能可扩展以及哪些功能缺失。
PostgreSQL 的 JSONB堪称优秀的二进制数据类型。它功能多样,除了作为混合关系数据库管理系统 (RDBMS) 之外,还可以兼作文档存储。有了它,我们可以:
MySQL 的 JSON 支持正在改进,但仍然缺乏原生索引和高级查询功能。
PostgreSQL 支持多种语言的存储过程,包括:
虽然 MySQL 支持 SQL 中的存储功能,但其功能和语言支持有限。
所以,PostgreSQL在数据库层内部的高级逻辑封装方面具有优势。
PostgreSQL 再次在此领域大放光彩,它支持流复制、逻辑复制和热备。它还支持多主服务器设置和零停机模式更改。PostgreSQL 的多主服务器功能需要第三方工具,例如 BDR 或 Citus。
MySQL 支持组复制、多源复制和只读副本,但在逻辑复制方面却略显不足。后者的应用范围也较为有限。
简而言之,PostgreSQL 和 MySQL 都可以实现高可用性。但 PostgreSQL 可以实现更精细的控制。
随着组织规模的扩大,数据库需求也会随之增长。让我们来探讨一下每个平台在垂直扩展、分片和大规模部署方面的表现。
当你需要支持表分区、分片(通过 Citus 或本机功能)和并行查询时,可以调用 PostgreSQL。
MySQL 是一个不错的选择,可以通过读取副本和集群(MySQL Cluster)实现水平扩展。但是,多写入器的设置更为复杂。
PostgreSQL 和 MySQL 都通过 RDS、Cloud SQL 和 Aurora 等托管服务获得 AWS、Azure 和 GCP 的全力支持。
PostgreSQL 因其更好的标准合规性和与 Kubernetes 和 Terraform 等云原生工具的集成而脱颖而出。
MySQL 同样令人印象深刻,它为 LAMP 技术堆栈和轻量级云部署提供了强有力的支持。
PostgreSQL 和 MySQL 都与 AWS Aurora 兼容。
如果想要一个具有卓越性能输出的 PostgreSQL 托管版本,那么 Aurora PostgreSQL 就是你的不二之选。另一方面,Aurora MySQL 则以增强的复制功能和更快的故障转移速度而闻名。
两者都支持开箱即用的高可用性吗?是的,但有一个开发者“警告”:Aurora 中 PostgreSQL 的功能集更接近原始 PostgreSQL,而 MySQL 的 Aurora 更接近普通 MySQL。
如果说有一件事可以决定开发人员的效率,那就是框架兼容性。每个数据库与流行的后端框架和 ORM 的集成程度如何?
PostgreSQL 拥有功能丰富的 SQL 方言,现在它已成为Django 的默认和推荐后端。
虽然 Django 确实很好地支持 MySQL,但两者之间的关系并非一帆风顺。某些 ORM 功能需要 PostgreSQL 才能完全运行。
Laravel 能够有效地支持这两种数据库。然而,PostgreSQL 略胜 MySQL 一筹,因为它拥有更强大的 ORM 功能,并且能够更好地处理 JSON 和约束。
PostgreSQL 和 MySQL 均享有以下方面的充分、持续的支持:
也就是说,由于其更广泛的 SQL 兼容性,PostgreSQL 不断解锁更高级的 ORM 功能。
SQLAlchemy
Hibernate
Doctrine
Prisma
但是,无论一个数据库管理系统(DBMS)多么强大、功能多么丰富,如果它轻视安全性,那么用户肯定会在第一次尝试时就放弃它。让我们来探讨一下 MySQL 和 PostgreSQL 在这方面的区别。
考虑近期迁移吗?本节将带你了解具体细节,包括如何将流行的 MySQL 迁移到 PostgreSQL。
你或许可能想要迈出这一步的原因完全合理:与 MySQL 相比,PostgreSQL 享有卓越的数据完整性、更大的可扩展性和高级 SQL 支持。
这是否意味着您将不会面临任何迁移挑战?当然,你会遇到,包括数据类型的差异、索引行为的变化以及不同的 SQL 方言。
好消息是,如果你使用这些迁移工具,这些问题都是可以克服的:
你的团队可能也需要投入一些人力。转换存储过程和触发器以及调整应用程序逻辑确实需要一些脑力劳动。
总而言之,PostgreSQL 的严格类型系统要求在迁移过程中进行仔细的验证。因此,要以极其细致的态度对待整个阶段。
虽然 PostgreSQL 和 MySQL 都支持跨数据库功能,但它们的处理方式却大不相同。
PostgreSQL 使用一组独特的库(称为外部数据包装器 (FDW))来方便连接到其他 PostgreSQL 实例。在某些情况下,它甚至可以连接到 MongoDB 或 Redis 等非关系型数据库。FDW 在实现高级查询下推方面表现出色,从而将操作卸载到远程系统。
相比之下,MySQL 包含联合表。表可以利用此本地化功能来引用远程 MySQL 实例中的表。它是否像 PostgreSQL 的 FDW 生态系统一样强大或积极开发?这不完全是。
MySQL 和 PostgreSQL 之间的选择并不像乍看起来那么简单。最终,它取决于你的工作负载、数据复杂性和合规性需求。
在以下情况下选择 PostgreSQL:
在以下情况下选择 MySQL:
作者:行动中的大雄
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。