mysql 5.5 到 mariadb 10.2.13:select 的执行时间增加了 4000%

Posted

技术标签:

【中文标题】mysql 5.5 到 mariadb 10.2.13:select 的执行时间增加了 4000%【英文标题】:mysql 5.5 to mariadb 10.2.13: 4000% increase in execution time for select 【发布时间】:2018-08-03 00:27:57 【问题描述】:

在从 mysql 5.5 迁移到 mariadb 10.2.13 后,我面临一个性能问题。包括配置在内的两台机器的大小是相同的。我们注意到某个 select 语句突然需要约 20 秒才能执行,而不是 0.5 秒。数据纯粹从内存中读取,因为在执行期间要测量的读取 IO 为零。将mariadb上的optimizer_switch改成mysql5.5的设置并没有改变执行计划。

mariadb 上 select 的解释如下:

mysql5.5上select的解释:

选择语句:

SELECT  acmh.OBJ_VERSION,acmh.peannr,acmh.pzsrnr,xuts.ptitle,
        acmh.pcategory,acmh.psalutatio,acmh.plastname,acmh.pfirstname,
        acmh.pcompanyna,syoq.paddress1,syoq.pzip,syoq.pcity,syoq.pphone1,
        syoq.pphone2,syoq.pphone3,syoq.pphone4,syoq.pemail,acmh.piscompany,
        xuts.id
    FROM  catalog1.tr_table_acmh acmh,catalog1.tr_table_syoq syoq,
        catalog1.tr_table_xuts xuts,catalog1.tr_table_wdvi link0,
        catalog1.tr_table_wdvi acl0
    WHERE  acmh.id=syoq.id
      AND  acmh.id=xuts.id
      AND  syoq.id=xuts.id
      AND  xuts.OBJ_TYPE IN (1557)
      AND ( (xuts.id=link0.pchild
       AND  link0.pparent='xkgrrslqkeaaaaendrxa'
       AND  link0.pname='folder')
       and  1 = 1 )
      AND  xuts.pvcurrent=1
      AND  (acl0.pchild=xuts.pacl
       AND  acl0.pparent='xkgrrswxbjaaaaaaabip'
       AND  acl0.pvalue>=20
           )
    order by acmh.plastname asc,
             acmh.pfirstname asc,
             acmh.pcompanyna asc
    LIMIT  10 OFFSET 0;

我是否缺少任何可以在 mariadb 上强制执行不同行为的开关?

【问题讨论】:

您是否已将表转换为 InnoDB?请同时显示查询。 添加了选择。所有表都是innodb。之后我通过执行 mysqldump 和 mysql_upgrade 传输数据(在 mariadb 上) 对于初学者,请确保您已在所有相关表上运行ANALYZE(您尚未提及您已完成)。与使用 InnoDB 5.5 的 MySQL/MariaDB 不同,MariaDB 10.2 具有默认使用持久统计信息的 InnoDB 5.7。可能是存储的统计值(如果有)与现实存在很大差异。 @elenst 你太棒了,谢谢,现在它在 0.6 秒内运行。如果您不想自己添加,我将阅读分析表的工作原理并添加答案。 当然,去吧。 【参考方案1】:

更新查询优化器的统计信息(涉及的 3 个表上的 ANALYZE TABLE)修复了这种情况下的问题。

SELECT 的新执行计划现在如下所示:

【讨论】:

【参考方案2】:

这些可能有助于提高性能:

 link0:  INDEX(pchild, pparent, pname)
 link0:  INDEX(pparent, pname, pchild)
 xuts:   INDEX(pvcurrent, OBJ_TYPE, id)
 acl0:   INDEX(pchild, pparent, pvalue)

您似乎有几张 1:1 的桌子;这是真的?如果有,为什么?

id 的数据类型是什么?这似乎是一个奇怪的长度:20。

【讨论】:

以上是关于mysql 5.5 到 mariadb 10.2.13:select 的执行时间增加了 4000%的主要内容,如果未能解决你的问题,请参考以下文章

Mariadb 5.5 比 MySQL 5.1 慢

mariadb 5.5数据库二进制包在centos6.5上的安装

MySQL的二进制安装方式

MySQL!性能被 MariaDB 吊打 ! ! !

初识MariaDB之1——MariaDB的安装

centos下安装mariadb