【问题标题】:MySQL Master and Slave with vastly different execution plansMySQL Master 和 Slave 具有截然不同的执行计划
【发布时间】:2010-12-26 22:47:18
【问题描述】:

我有一个复杂的 MySQL 查询,它连接三个表并自连接一个表。

有一个 Master 和一个 Slave 具有相同的数据和索引。 Master 与 Slave 相比是一个强大的盒子,但查询在 Slave 上的运行速度快了 10 倍(在 Master 的轻负载期间)。

执行计划大不相同。

Master execution plan
1, 'SIMPLE', 'table3_', 'const', 'PRIMARY', 'PRIMARY', '12', 'const', 1, 100.00, 'Using temporary; Using filesort'
1, 'SIMPLE', 'table2_', 'ref', 'PRIMARY,FK376E02E910238FCA', 'FK376E02E910238FCA', '13', 'const', 105, 100.00, 'Using where'
1, 'SIMPLE', 'table0_', 'ref', 'FK57012F937DD0DC02,FK57012F9398CD28D0', 'FK57012F9398CD28D0', '13', 'table2_.ID', 1515, 100.00, 'Using where'
1, 'SIMPLE', 'table1_', 'eq_ref', 'PRIMARY,FKE7E81F1ED170D4C9', 'PRIMARY', '8', 'table0_.FK_ID', 1, 100.00, 'Using where'

Slave execution plan
1, 'SIMPLE', 'table3_', 'const', 'PRIMARY', 'PRIMARY', '12', 'const', 1, 100.00, 'Using filesort'
1, 'SIMPLE', 'table1_', 'ref', 'PRIMARY,FKE7E81F1ED170D4C9', 'FKE7E81F1ED170D4C9', '9', 'const', 187398, 100.00, 'Using where'
1, 'SIMPLE', 'table0_', 'ref', 'FK57012F937DD0DC02,FK57012F9398CD28D0', 'FK57012F937DD0DC02', '9', 'table1_.ID', 1, 100.00, 'Using where'
1, 'SIMPLE', 'table2_', 'eq_ref', 'PRIMARY,FK376E02E910238FCA', 'PRIMARY', '12', 'table0_.FK_ID', 1, 100.00, 'Using where'

表以不同的顺序处理,主数据库使用临时表和文件排序,而从数据库只使用文件排序。

哪些因素会导致执行时间差异如此巨大的不同计划?

更新:

这可能与索引统计有关吗?我计划在低容量期间在 Master 上运行 ANALYZE TABLE。 SHOW INDEX 显示了 Master 和 Slave 之间某些键的非常不同的基数。

【问题讨论】:

标签: mysql sql-execution-plan


【解决方案1】:

SHOW INDEX 显示 Master 和 Slave 之间某些键的非常不同的基数。

我遇到了同样的问题,我发现原因是:不同的基数。然后我运行分析表,基数相同,问题就消失了。

【讨论】:

    【解决方案2】:

    MySQL 根据收集的统计数据优化查询。

    查看您的输出,您会发现它们使用不同的键,您可能需要添加键提示甚至强制键

    FROM table2_JOIN

    应该变成

    FROM table2_USE KEY('FK376E02E910238FCA') JOIN

    或强制键

    【讨论】:

    • 实际的统计数据会随着时间的推移而变化,所以我宁愿不提供关键提示。今晚我将尝试使用 ANALYZE TABLE 来重建统计数据,看看这是否有帮助。如果是这样,我会将其添加到数据库的日常维护计划中。
    • 在 master 的相关表上运行 ANALYZE TABLE 后,我得到了与 slave 相同的执行计划和可比的执行时间。我将选择此答案,因为它与收集的统计信息最接近,但我没有在查询中指定键,并且认为在这种情况下这不是一个好主意。
    【解决方案3】:

    对我来说,这看起来像是查询优化器中的一个错误。我会report it

    两台服务器是否在同一版本的 MySQL 上?

    【讨论】:

    • 两者都使用完全相同的 MySQL 版本,尽管 Master 使用 64 位版本,而从属使用 32 位版本。
    • “只是不同的计划”不是错误
    • 一个不同的计划导致在更快的硬件上执行更慢。对我来说,这听起来像是一个性能错误。
    • 问题是Master上的索引统计不是很准确。从站有相当准确的统计数据,因为它最近才连接到主站,因此创建了索引统计信息,还有更多数据要处理。
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多