【问题标题】:Poor mariadb performance vs mysqlmariadb 性能与 mysql 相比较差
【发布时间】:2018-11-17 14:23:57
【问题描述】:

听说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 |
+----+-------------+----------+------+--------------------------+---------+---------+-------+--------+-----------------------------+

【问题讨论】:

  • 请解释选择...
  • 索引是否相同?
  • 是的,相同的索引,相同的数据,我克隆了数据库并将其迁移到mariadb
  • MariaDB 配置设置(在 my.cnf 中)是否与 MySQL 的配置设置(内存、缓冲区等)匹配?迁移是如何进行的?同时进行实验:尝试在 MariaDB 中重新创建索引,运行optimize table

标签: mysql performance mariadb


【解决方案1】:

很难说是测试用例错误,还是分支之间有那么大的差异。我会漫无边际地谈论许多可能性中的一些(除了斯宾塞的):

请提供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

【讨论】:

【解决方案2】:

除了获取时间,在两种环境中运行EXPLAIN,并进行比较。也许 MariaDB 正在使用不同的索引,或者正在执行完整扫描。也许 InnoDB 统计信息不是最新的...向 MariaDB 优化器表明该表不是空的。

有了这么大的差异,我倾向于认为 I/O 可能是一个贡献者。

也许 MySQL 实例上的 InnoDB 缓冲池比 Mariadb 实例上的大得多。 (这不是一个明确的诊断。这只是我会考虑的事情。

我会查看 InnoDB 缓冲区缓存的大小和存储架构,并验证它们在两台服务器上是否相同。

在比较性能时,我会在每个实例上多次运行相同的查询,去掉第一次执行的时间,然后平均剩余时间。

说“用他的整个数据库克隆”让我们相信关于数据库的一切都是相同的,相同的存储引擎、相同的索引、相同的字符集和字符列的排序规则、等效的数据库配置等等。但也许我们的信念是没有根据的。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 2014-11-01
    • 2020-06-08
    • 2017-09-26
    • 1970-01-01
    • 2021-09-23
    • 2012-05-09
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多