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 代码。首页并非单一的复杂查询,而是通过多次小型读取操作来获取列表、分类数据、计数以及页脚信息。
从生产环境标准来看,该数据库规模并不大,但它是真实的应用数据,而不是生成的基准数据集:
motor_ilanlar记录因此,这只是针对特定工作负载的一个有用测试,而不是对数据库引擎的通用性排名。
两次测试我都使用了同一台 Hetzner 服务器:8 核处理器、32 GB 内存和 Ubuntu 20.04 操作系统。测试前,系统处于空闲状态,平均负载低于 1。
重要的对比细节如下:
motor_ilanlar记录行。127.0.0.1。--network host,因此没有 NAT 或代理跃点。PostgreSQL 的数据来自之前针对生产环境进行的同平台基准测试。该生产环境使用 PostgreSQL 的 SQL,并且其 PostgreSQL 实例托管着多个站点的数据库,因此 PostgreSQL 的结果可以提供有用的背景信息,而不是纯粹的引擎间比较。
k6 阈值分别为p(95) < 200 ms和p(99) < 500 ms。
| 指标 | MariaDB 10.3.39 | MySQL 8.0.42 | PostgreSQL 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,025 | 15,930 | 15,590 |
| 请求失败 | 0% | 0% | 0% |
| 数据库 RSS 峰值 | 141 MB | 411 MB | 1.7 GB** |
| 平均负载,1分钟平均值/峰值 | 0.88 / 1.34 | 1.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 和内存占用不能仅仅归因于此工作负载。
我还运行了一个较小的 15 VU 测试,持续两分半钟。测试开始时,数据库的“温度”与之前相同。
| 指标 | MariaDB 10.3.39 | MySQL 8.0.42 | MySQL 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% | 不适用** |
| 数据库 RSS | 141 MB | 411 MB | 162 MB | 1.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 成为一个不合理的选择。
作者:场长
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。