我听说Mariadb的性能比mysql更好,所以我克隆了一个包含他整个数据库的网站,以比较两者之间的差异。
确实,缓存一切似乎都更快,但是当没有缓存时,我的输出非常奇怪,在某些大请求下,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 |
+----+-------------+----------+------+--------------------------+---------+---------+-------+--------+-----------------------------+
除了获取计时之外,还可以在两个环境中运行EXPLAIN
并进行比较。也许MariaDB正在使用不同的索引,或者进行完全扫描。也许InnoDB的统计数据不是最新的...向 MariaDB 优化器指示表为空,而实际上并非如此。
由于差异如此之大,我倾向于认为 I/O 可能是一个贡献者。
也许 MySQL 实例上的 InnoDB 缓冲池比 Mariadb 实例上的大得多。(这不是一个明确的诊断。这只是我会考虑的事情。
我会查看InnoDB缓冲区缓存的大小和存储架构,并验证它们在两台服务器上是否相同。
在比较性能时,我会在每个实例上多次运行相同的查询,丢弃第一次执行的时间,并平均剩余时间。
说"克隆他的整个数据库"让我们相信数据库的所有内容都是相同的,相同的存储引擎,相同的索引,相同的字符集和字符列排序规则,等效的数据库配置等等。但也许我们的信念是没有根据的。
很难说这是一个测试用例错误,还是分支之间存在很大的差异。 我将漫无边际地谈论许多可能性中的一些(除了斯宾塞的(:
请提供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
了吗?