MySQL Master和Slave具有截然不同的执行计划

时间:2009-12-15 19:10:46

标签: mysql sql-execution-plan

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

有一个Master和Slave具有相同的数据和索引。与Slave相比,Master是一个功能强大的盒子,但是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之间的一些键的基数非常不同。

3 个答案:

答案 0 :(得分:2)

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

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

FROM table2_ JOIN

应该成为

FROM table2_ USE KEY('FK376E02E910238FCA')JOIN

或FORCE KEY

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

<块引用>

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

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