我听说Mariadb的性能比mysql好,所以我用他的整个数据库克隆了一个网站来比较2的差异。
实际上,一切缓存似乎更快,但是当没有缓存时我输出非常奇怪,在一些大的请求上,mariadb远比mysql差:
MariaDB> select SQL_NO_CACHE [...] ORDER BY FIELD LIMIT 0, 200;
Empty set (10.13 sec)
mysql> select SQL_NO_CACHE [...] ORDER BY FIELD LIMIT 0, 200;
Empty set (0.76 sec)
这是一个巨大的差异,怎么可能?
完整查询如下所示:
SELECT
SQL_NO_CACHE [...]
FROM
table1
WHERE
field1 = 'val1' and
field2 = 'val2' and
(field3='val3' or INSTR(field3, 'val3'))
ORDER BY field4 DESC LIMIT 0, 200;
以下是请求的说明:
+----+-------------+----------+------+--------------------------+---------+---------+-------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+--------------------------+---------+---------+-------+--------+-----------------------------+
| 1 | SIMPLE | table1 | ref | field1,field3 | field1 | 123 | const | 125832 | Using where; Using filesort |
+----+-------------+----------+------+--------------------------+---------+---------+-------+--------+-----------------------------+
答案 0 :(得分:3)
除了获取时间,在两个环境中运行EXPLAIN
并进行比较。也许MariaDB正在使用不同的索引,或进行全面扫描。也许InnoDB统计数据不是最新的......向MariaDB优化器表明,当表不是时,表是空的。
如果有这么大的差异,我倾向于认为I / O可能是一个贡献者。
也许InnoDB缓冲池在MySQL实例上要比在Mariadb实例上大得多。 (这不是一个明确的诊断。这只是我会考虑的事情。
我会查看InnoDB缓冲区缓存的大小和存储架构,并验证它们在两台服务器上是否相同。
在比较性能时,我会在每个实例上多次运行相同的查询,抛弃第一次执行的时间,并平均剩余的时间。
说“用他的整个数据库克隆”让我们相信数据库的所有内容都是相同的,相同的存储引擎,相同的索引,相同的字符集和字符列的排序,等效的数据库配置等等。但也许我们的信念是不合理的。
答案 1 :(得分:1)
很难说这是一个测试用例错误,还是分支之间存在很大差异。我会谈论一些可能性(除Spencer之外):
请提供SHOW CREATE TABLE
。
两台服务器都需要
INDEX(field1, field2, field4)
1和2可以按任意顺序排列; 4需要持久。
有没有子查询?这是MySQL和MariaDB显着分歧的一个领域。
OR
是性能杀手;您想帮助使用UNION
吗?
我的一个经验法则是缓存产生10倍的差异。这两个时间相差大约10倍。是不是MySQL正在使用热缓存?简单的测试是两次运行两次,然后进行第二次。
MySQL和MariaDB的哪些版本?他们的优化者开始以5.6 / 10.0的速度进行重大改道。我已经看到了很大的时间差异无论哪种方式。 (并且跟踪帮助的优化器功能并不总是很容易。)
是否涉及虚拟或生成列?这是另一个重大分歧的领域。还是JSON?我已经问过SHOW CREATE TABLE
了吗?