与mysql 5.6相比,mariadb 10的查询时间更长

ee7vknir  于 2022-11-08  发布在  Mysql
关注(0)|答案(2)|浏览(140)

我们最近将一个PHP Web应用程序迁移到了另一个主机上。同时,数据库也被成功地复制到了新的mysql服务器上。数据库服务器的早期版本是mysql5.6,而新的主机安装了mariadb 10。下面是一个示例查询,在旧的主机上需要大约0.5秒,而在新的主机上需要mariadb。这需要大约40秒,这是非常长的。这长时间是chocking了托管服务器。

SELECT 
                IB.IndicatorId, 
                IB.IndicatorTitle,
                IB.IndicatorCode,
                IC.IndicatorCategoryName,
                AA.Answer,
                GROUP_CONCAT(AI.`Answer`) AS CombinedAnswers
            FROM answer AS A
            LEFT JOIN answers_answer AS AA ON AA.AnswerId = A.AnswerId
            LEFT JOIN activity_sections_indicators AS ASI ON ASI.SectionIndicatorId = AA.SectionIndicatorId
            LEFT JOIN indicators_bank AS IB ON IB.IndicatorId = ASI.IndicatorId
            LEFT JOIN indicator_categories AS IC ON IC.IndicatorCategoryId = IB.IndicatorCategoryId
            LEFT JOIN answers_items AS AI ON AI.AnswerAnswerId = AA.AnswerAnswerId
            WHERE A.ProgramActivityId IN (103,104,105) 
            AND A.Code = 'Newsas263'
            GROUP BY IB.IndicatorId

另外,表中的记录数如下
答案:5355
答案_答案:845209
活动部分指示器:2866
指标库:1175
指标类别:17
答案项(_I):934347
我的理解是,在mariadb服务器配置中缺少一些东西,尽管查询也可以优化。我有VPS,可以更改mariadb的配置,但我不确定从这里做什么。
如果需要更多的细节,请告诉我。我真的很感谢你在这方面的帮助。

goqiplq2

goqiplq21#

MySQL和MariaDB在5.6中有明显的差异。很难发现具体的不同之处。
EXPLAIN SELECT ...输出可能会有所帮助。
这些复合索引和/或覆盖索引可能对两台服务器都有帮助:

IB:  INDEX(IndicatorId,  IndicatorTitle, IndicatorCode, IndicatorCategoryId)
IC:  INDEX(IndicatorCategoryId,  IndicatorCategoryName)
AA:  INDEX(AnswerId,  Answer, SectionIndicatorId, AnswerAnswerId)
AI:  INDEX(AnswerAnswerId,  Answer)
A:   INDEX(Code, ProgramActivityId, AnswerId)
ASI: INDEX(SectionIndicatorId,  IndicatorId)

当添加复合索引时,DROP具有相同前导列的索引。也就是说,当同时具有INDEX(a)和INDEX(a,b)时,丢弃前者。
A上的索引可能是最重要的。
是否有任何表是“多对多”的?
MariaDB的哪个版本?已经有10.0到10.7的版本了。

zf9nrax1

zf9nrax12#

我能够解决问题。
感谢“Ergest Basha”、“Markus Zeller”和“Rick James”的推荐/建议。
我对查询运行了“解释选择...”,但“执行计划”存在一些差异。我能够消除这些差异,新服务器上的查询现在可以正常工作。
虽然我不能清楚地找出差异,但我只是重新复制了整个数据库,问题得到了解决。

相关问题