Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL主服务器和从服务器的执行计划截然不同_Mysql_Sql Execution Plan - Fatal编程技术网

MySQL主服务器和从服务器的执行计划截然不同

MySQL主服务器和从服务器的执行计划截然不同,mysql,sql-execution-plan,Mysql,Sql Execution Plan,我有一个复杂的MySQL查询,它连接三个表,并将一个表自连接到自身 主设备和从设备具有相同的数据和索引。与从机相比,主机是一个功能强大的盒子,但是查询在从机上的运行速度要快10倍(在主机的轻负载期间) 执行计划大不相同 Master execution plan 1, 'SIMPLE', 'table3_', 'const', 'PRIMARY', 'PRIMARY', '12', 'const', 1, 100.00, 'Using temporary; Using filesort' 1,

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

主设备和从设备具有相同的数据和索引。与从机相比,主机是一个功能强大的盒子,但是查询在从机上的运行速度要快10倍(在主机的轻负载期间)

执行计划大不相同

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'
这些表以不同的顺序处理,主数据库使用临时表和文件排序,而从数据库仅使用文件排序

什么因素会导致执行时间如此巨大的不同计划

更新:


这可能与指数统计有关吗?我计划在低容量期间在主机上运行分析表。SHOW INDEX为主键和从键之间的某些键显示了非常不同的基数。

在我看来,这似乎是查询优化器中的一个错误。我会的


两台服务器都在同一版本的MySQL上吗?

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

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

从表2开始加入

应该成为

从表2_uu使用键('FK376E02E910238FCA')连接

或强制键

SHOW INDEX显示主键和从键之间的某些键的不同基数


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

两者都使用完全相同的MySQL版本,尽管主版本使用64位版本,而从版本使用32位版本。“只是不同的计划”不是一个错误。不同的计划会导致在更快的硬件上执行较慢。对我来说,这听起来像是一个性能缺陷。问题是主机上的索引统计数据不是很准确。从属服务器有相当准确的统计数据,因为它最近连接到主服务器,因此创建了索引统计数据,其中包含更多数据。实际统计数据将随着时间的推移而变化,因此我不想提供关键提示。今晚我将尝试一个分析表来重建统计数据,看看这是否有帮助。如果是这样,我将把它添加到数据库的日常维护计划中。在主控机的相关表上运行ANALYZE TABLE之后,我得到了与从机相同的执行计划和可比的执行时间。我之所以选择这个答案,是因为它与收集的统计数据最接近,但我没有在查询中指定一个键,我认为在这种情况下这不是一个好主意。这是一个相同问题的线程