多年来一直没有使用 MySQL 系列。现在需要从 OracleDB 迁移到 MariaDB 或 PostgreSQL。
因此在类似的“硬件”(,,Openstack VM: RHEL 7.3
)上得到了并排。4HT cores of 2.5GHz Xeon E312xx
"local" SAN & SATA storage
Oracle11g
MariaDB10.3
创建了一组简单的 10 列表,其中有数字主键,没有索引/触发器/等。一个 Java(Hibernate+JDBC)1 线程 1 连接应用程序,循环中仅执行 6 次插入(每 100 个周期提交一次)。
我要么做错了什么,要么对 MariaDB 的性能期望过高,但在 OracleDB 上,此例程需要 348ms/周期(6*100 插入 + 提交),而在 MariaDB 上同样需要 3291ms/周期,换句话说,在相同硬件上比 OracleDB 慢 10 倍左右(我在 Java 应用程序中切换的只是休眠方言和连接 url/用户/密码)。我确实使用 tcpdumps 仔细检查了该应用程序是否具有相同的性能,只是数据库的响应时间相差很大。
就我目前所见,我应该降低对 MariaDB 性能的期望,还是应该继续深入研究 IOwait 跟踪或对 MariaDB 进行微调?只是在任何地方都找不到 MariaDB 的“正常”性能参考(在某些参考硬件上)... 5+ms/insert 感觉“太多了”...
更新:
找到了文章:
显示它们
PrepareStatementBatch100InsertPrepareHit.mariadb
(执行 1000 次插入批次)在 5 毫秒内完成,因此每次插入大约需要 5 微秒……
看来我们的设置比预期慢 1000 倍……
更新 2
从 Openstack VM 移至裸机等效物(所有参数相同,但 CPU 为 Xeon E5450 @3GHz 的 4HT 核心)。使用默认设置安装 OracleDB 和 MariaDB,迁移架构。
在裸机 MariaDB 上,“6*100 INSERT + 提交”花费 430ms/周期,完全可以与 OracleDB 媲美(从某种意义上说,通过普通的 jdbc/PreparedStatements 执行此操作而无需任何批处理,也完全可以接受)。“6*100 DELETE + 提交”也是如此 - 625ms/周期。现在我面临的唯一剩余问题是 SelectForUpdates/UPDATE 很慢。
以下混合(由应用程序完成,因此选为微工作台)在 MariaDB 上的性能:
- 13 个 SELECT + 5 个 SFU + 6 个 UPDATE + 提交 = 以前的 Openstack VM 设置上耗时 252 毫秒
- 13 个 SELECT + 5 个 SFU + 6 个 UPDATE + 提交 = 新裸机设置上耗时 133 毫秒
- 13 个 SELECT + 0 个 SFU + 6 个 UPDATE + 提交 = 新的裸机设置上耗时 122 毫秒
- 13 个 SELECT + 5 个 SFU + 0 个 UPDATE + 提交 = 新裸机设置上 122 毫秒
为了进行比较,在 OracleDB Openstack VM 上:
- 13 个 SELECT + 5 个 SFU + 6 个 UPDATE + 提交 = 14ms
目前 - 用尽了明显的/记录的优化并尝试了一些违反直觉的测试,例如禁用任何分区/索引/外键/等等......