17611538698
webmaster@21cto.com

MariaDB、MySQL与PostgreSQL三款开源数据库的基准测试

数据库 0 9 38分钟前
图片

21CTO 导读:本文作者通过一款真实的应用,使用三款开源数据库分别进行测试,从而了解哪款数据库更快。

我最近在用真实的mpazari.com应用,分别对 MariaDB、MySQL 和 PostgreSQL 进行了比较。我的目标并非建立一个综合的数据库基准测试,而是想回答一个更实际的问题:当应用程序发送大量查询时,MariaDB 是否真的具备优势?

这个问题源于我读到的一篇技术文章,该文章论述PostgreSQL明显比MySQL快,但是对于包含大量简单查询的应用来说,我认为MariaDB更快,而PostgreSQL可能更适合复杂的连接操作。有人在技术群组中建议我,MariaDB与PostgreSQL的比较会比PostgreSQL与MySQL的比较更有意义。

我之前将 mpazari.com 从 MySQL 8 迁移到了 PostgreSQL 12。这次迁移让服务器感觉轻了很多,但并没有解决 MariaDB 的问题。所以我将相同的数据分别恢复到 MariaDB 和 MySQL 中,并将结果与之前 PostgreSQL 的运行结果进行了比较。

准备应用程序


mpazari.com 是一个土耳其摩托车分类广告网站。该应用程序是一个基于 Spring Boot 4 / Java 25 GraalVM 的原生镜像,使用手写 SQL 代码。首页并非单一的复杂查询,而是通过多次小型读取操作来获取列表、分类数据、计数以及页脚信息。

从生产环境标准来看,该数据库规模并不大,但它是真实的应用数据,而不是生成的基准数据集:

  • 31 张数据表
  • 20,750 行motor_ilanlar记录
  • 测试工作负载大约使用了 111 MB 的数据。
  • 每个首页请求大约需要五个简单的数据库查询。


因此,这只是针对特定工作负载的一个有用测试,而不是对数据库引擎的通用性排名。

测试设置


两次测试我都使用了同一台 Hetzner 服务器:8 核处理器、32 GB 内存和 Ubuntu 20.04 操作系统。测试前,系统处于空闲状态,平均负载低于 1。

重要的对比细节如下:

  • 将相同的切换前转储恢复到 MariaDB 和 MySQL 中:31 个表和 20,750 motor_ilanlar记录行。
  • MariaDB 和 MySQL 运行使用了相同的应用程序构建和运行时设置。
  • 每次主运行前,应用程序都会重新启动。
  • MariaDB 和 MySQL 只监听127.0.0.1。
  • MySQL 运行在 Docker 中--network host,因此没有 NAT 或代理跃点。
  • MariaDB 使用了 3306 端口,MySQL 使用了 3307 端口。
  • k6 系统先将虚拟用户数提升至 50 个并维持一分钟,然后保持该负载五分钟,最后再降低一分钟。每次迭代都会加载主页并休眠一秒钟。


PostgreSQL 的数据来自之前针对生产环境进行的同平台基准测试。该生产环境使用 PostgreSQL 的 SQL,并且其 PostgreSQL 实例托管着多个站点的数据库,因此 PostgreSQL 的结果可以提供有用的背景信息,而不是纯粹的引擎间比较。

k6 阈值分别为p(95) < 200 ms和p(99) < 500 ms。

主要基准数据


指标MariaDB 10.3.39MySQL 8.0.42PostgreSQL 12*
平均的125.52毫秒132.40毫秒156.97 毫秒
p(95)129.73毫秒139.43毫秒171.86毫秒
p(99)182.13毫秒150.07 毫秒177.16 毫秒
最大限度229.31毫秒243.90 毫秒287.17 毫秒
请求16,02515,93015,590
请求失败0%0%0%
数据库 RSS 峰值141 MB411 MB1.7 GB**
平均负载,1分钟平均值/峰值0.88 / 1.341.27 / 2.01–

MariaDB 的平均速度比 MySQL 快约 5%,在 p(95) 时快约 7%。在上下文比较中,PostgreSQL 的平均速度比 MariaDB 慢约 25%。MariaDB 和 MySQL 之间的差异是真实存在的,但并不显著。所有三个测试结果均轻松超过了延迟阈值。

更有趣的结果是尾部:MySQL 的 p(99) 为 150 毫秒,而 MariaDB 为 182 毫秒,PostgreSQL 为 177 毫秒。MariaDB 在平均值和 p(95) 方面胜出,但在本次测试中,MySQL 处理最慢的 1% 请求的稳定性更高。

PostgreSQL 是在之前的实时堆栈运行中测量的,但使用了不同的 SQL 文本和一个共享集群。

生产环境中的 PostgreSQL 实例托管着多个站点的数据库,因此其 CPU 和内存占用不能仅仅归因于此工作负载。

较小的 CPU 对比


我还运行了一个较小的 15 VU 测试,持续两分半钟。测试开始时,数据库的“温度”与之前相同。

指标MariaDB 10.3.39MySQL 8.0.42MySQL 8.0.42 ( performance_schema=OFF)PostgreSQL 12*
平均值 / p(95)125.12 / 130.26 毫秒130.25 / 136.35 毫秒130.81 / 136.82 毫秒158.7 / 169.2 毫秒
数据库 CPU 平均/峰值0.2% / 1.0%6.6% / 9.0%8.3% / 10.0%不适用**
数据库 RSS141 MB411 MB162 MB1.7 GB**

PostgreSQL 是在之前的实时堆栈运行中测量的。PostgreSQL 的 CPU 和内存占用并非仅由此工作负载造成,因为该实例由多个站点共享。

对于这项工作负载,MariaDB 的 CPU 使用率明显更低。应用程序发送了许多简单的查询,而 MariaDB 的执行器似乎能够以更低的开销处理这些查询。这一结果与最初的声明最为吻合。

CPU 使用率数据不应被解读为 MySQL 开销大的普遍结论。测试的请求速率较低,数据库大部分时间处于等待状态。在这种规模下,几个百分点的 CPU 使用率不会影响服务级别协议 (SLA),但在规模较小的服务器或请求速率更高的情况下,这些影响可能会变得显著。

内存与 performance_schema


MySQL 首次运行使用了 411 MB 的常驻内存,而 MariaDB 仅使用了 141 MB。这看起来差距很大,但它们的默认设置并不相同:MariaDB 默认 performance_schema禁用内存,而 MySQL 默认启用内存。

禁用后performance_schema,MySQL 使用了 162 MB 内存。这与 MariaDB 的 141 MB 内存非常接近,因此最初的内存比较主要是配置差异,而不是某个引擎本身具有 900 MB 的优势。

这能证明什么,又不能证明什么?


这一基准测试结果支持以下一个较为狭窄的结论:

对于这个应用场景,由于查询简单且数据集较小且完全驻留,MariaDB 10.3 的平均速度略快于 MySQL 8.0,并且 CPU 使用率更低。在这台机器上,PostgreSQL 的运行速度较慢,但这并非纯粹的引擎性能比较。

这并不能证明 MariaDB 总是比 MySQL 或 PostgreSQL 快。它也无法展示任何引擎在处理大型连接、分析查询、争用写入、复制、不同索引或更大的数据集时的表现。

此外,版本差异也是一个需要考虑的因素。MariaDB 10.3 是 2019 年发布的版本,而 MySQL 8.0.42 是较新版本。与 MariaDB 10.6 或 11.x 版本进行比较可能会得出不同的 CPU 使用率和延迟结果。MySQL 8 的一些特性,例如 CTE 和窗口函数,与本次工作负载无关。

图片

结语


可以看到,mpazari.com 的简单查询预测结果成立。

MariaDB 的平均速度比 MySQL 快约 5%,在 p(95) 时快约 7%,并且在规模较小的比较中 CPU 使用率更低。PostgreSQL 的上下文结果平均比 MariaDB 慢约 25%,但由于其不同的 SQL 方言和共享集群,该比较结果仅具有方向性而非决定性。

MySQL 在主要运行中具有更好的 p(99) 性能,并且在performance_schema禁用某些功能后,其明显的内存劣势基本消失。

这些差异虽然有趣,但并不足以使数据库引擎成为瓶颈。两个数据库都轻松满足了服务级别协议 (SLA) 的要求。对于此应用而言,模式设计、索引、缓存、连接处理以及服务器栈的其他部分比基于 5% 的平均延迟差异来选择 MariaDB 或 MySQL 更为重要。

所以,最初问题的答案:确定,MariaDB 对于许多简单查询来说速度更快,这个实际应用也证实了这一点。PostgreSQL 在本次测试中速度较慢,但需要进行类似的重复测试才能得出引擎层面的确切结论。MariaDB 相对于 MySQL 的优势很小,且仅限于特定工作负载,不足以使 MySQL 成为一个不合理的选择。

作者:场长

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信