我们最近将一个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的配置,但我不确定从这里做什么。
如果需要更多的细节,请告诉我。我真的很感谢你在这方面的帮助。
2条答案
按热度按时间goqiplq21#
MySQL和MariaDB在5.6中有明显的差异。很难发现具体的不同之处。
EXPLAIN SELECT ...
输出可能会有所帮助。这些复合索引和/或覆盖索引可能对两台服务器都有帮助:
当添加复合索引时,DROP具有相同前导列的索引。也就是说,当同时具有INDEX(a)和INDEX(a,b)时,丢弃前者。
A上的索引可能是最重要的。
是否有任何表是“多对多”的?
MariaDB的哪个版本?已经有10.0到10.7的版本了。
zf9nrax12#
我能够解决问题。
感谢“Ergest Basha”、“Markus Zeller”和“Rick James”的推荐/建议。
我对查询运行了“解释选择...”,但“执行计划”存在一些差异。我能够消除这些差异,新服务器上的查询现在可以正常工作。
虽然我不能清楚地找出差异,但我只是重新复制了整个数据库,问题得到了解决。