我听说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 |
+----+-------------+----------+------+--------------------------+---------+---------+-------+--------+-----------------------------+发布于 2018-06-07 23:50:49
除了获取时间之外,还需要在两个环境中运行EXPLAIN,然后进行比较。也许MariaDB正在使用不同的索引,或者正在执行完全扫描。也许InnoDB统计数据不是最新的.指示MariaDB优化器该表为空,而不是空的。
有了这么大的差异,我倾向于认为I/O可能是一个贡献者。
也许MySQL实例上的InnoDB缓冲池比Mariadb实例上的要大得多。(这不是一个明确的诊断。这只是我会考虑的事情。
我将查看InnoDB缓冲区缓存的大小和存储体系结构,并验证它们在两台服务器上是否相同。
在比较性能时,我会在每个实例上多次运行相同的查询,丢弃第一次执行的时间,并对剩余时间进行平均。
说“用他的整个数据库克隆”让我们相信数据库的一切都是相同的,相同的存储引擎,相同的索引,相同的字符集和字符列排序规则,等价的数据库配置,等等。但也许我们的信念是没有根据的。
发布于 2018-06-08 10:48:49
很难说这是一个测试用例错误,还是分支之间有这么大的差异。我将漫谈许多可能性中的一些(除了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
https://stackoverflow.com/questions/50745143
复制相似问题