MySQL 5.5 和 MariaDB5.5 对于相同的数据和相同的选择查询返回不同数量的列?

MySQL 5.5 和 MariaDB5.5 对于相同的数据和相同的选择查询返回不同数量的列?

我在网上搜索了一段时间,但似乎找不到这个问题的答案。如果能得到一些建议,我将不胜感激。简而言之,这就是问题所在。

我们确实有 2 台服务器。一台在 centos6/mysql5.5 上运行,配备 12 个 CPU 核心和 24GB 内存,第二台在 centos7/mariadb5.5 上运行,配备 24 个 CPU 核心和 32GB 内存。两台服务器的 dbms 数据相同;使用 mysqldump 从 mysql55 复制数据,并导入到 mariadb5.5。mysql 和 mariadb 的配置也从较小的系统复制到较大的系统;它们完全相同。

第一个问题是,当处于相同负载下时,mysql5.5 的表现符合预期,负载平均值约为 4 到 8;mariadb5.5 的表现非常糟糕,负载平均值为 700 到 900。mariadb 系统上的“显示进程列表”命令显示许多连接运行时间超过 5 分钟,并且处于“复制到临时表”状态。在较小的系统 mysql5.5 上可以看到相同的查询,但它们确实在 1-2 秒内执行。

我尝试运行 maraidb,并在较大的 RAM 分区上创建 tmpdir。这减少了负载,但效果不大,最终又回到了 700。

我注意到的第二件事是,如果我对其中一个长时间运行的查询进行解释,那么来自 mysql 的查询将返回大约 3k 行,而另一台服务器对同一查询进行相同的解释将返回大约 7k 行。

我不确定是什么原因造成的。查询主要是“选择”,很少使用“和”和“或”。

感谢您抽出时间。如果您对此有任何意见,我将不胜感激。

答案1

在进一步比较两个系统上运行时间最长的一些查询的解释后,我注意到运行 mariadb 的服务器在执行操作时没有使用 join_buffer。

当我寻找可能的原因时,我发现了这个变量:

https://mariadb.com/kb/en/mariadb/server-system-variables/#join_cache_level

果然,在将其从默认的 2 更改为 8 之后;因此我们允许 dbms 在执行连接操作时选择更多基于块的算法,一切都开始正常工作。我不是 db 专家,也不完全确定此操作可能带来的后果。我怀疑内存占用会增加,但从性能方面来看,它似乎让盒子“飞”起来。平均负载现在从 1200 降至 5

我的情况似乎在某种程度上是孤立的,因为我正在运行的应用程序正在执行一些非常长的选择和多个连接。但我猜对于任何具有类似 sql 工作负载的 mysql 到 mariadb 转换,行为都是相同的。

答案2

我在 Centos 7 Linux 下使用 mariadb 10。它运行良好,因为默认情况下数据库按文件存储每个表,按其他文件存储索引。检查是否为“where”和“join on”子句中使用的字段创建了索引。正确选择索引字段可能会使性能提高 100 倍以上。您可以在此找到如何在 Centos 7 上安装 mariadb 10https://mariadb.com/kb/en/mariadb/yum/

相关内容