2014-07-04 78 views
1

我们面临的问题是我们有一个查询,然后在主数据库上运行6-7秒,但是在我们的从属数据库上,这可能会花费5分钟以上。在不同的服务器上运行不同索引的Mysql

我发现查询的执行计划在主服务器上执行时比从服务器上执行计划有所不同。不同的是,在其中一个表上,从DB使用的是与主服务器不同的索引。

更重要的是,当我在从属数据库的putty命令行中执行这个非常相同的查询时,它实际上使用与主DB相同的执行计划。执行计划仅在查询来自我们的前端应用程序并在从属数据库上执行时才会更改。

作为一个快速修复,我把一个FORCE INDEX放到sql中以使用master使用的索引,这似乎只是部分修复了多索引只有1部分似乎被使用。主数据库使用的密钥长度为7,而从服务器使用的密钥长度为4.

有问题的查询是一个包含多个连接的非常大的查询。这是在索引中的一个联结中,它正在误入歧途并使用不同的索引。这也是我把力量指数放在哪里的地方。

我们在MyISAM表中使用Mysql。

我的问题是,什么会导致这种行为,为什么当完全相同的查询运行良好时,从命令行执行?

+1

你使用的是mysql还是sql-server?你标记了两个。解决问题的最快捷方式可能是为相关数据库,表和相关对象生成创建脚本,并在它们上运行diff。 – Tristan

+0

我建议您考虑此问题的答案:http://stackoverflow.com/问题/ 321461/when-should-database-indexes-be-rebuilt –

+0

@Tristan我们在MyISAM表中使用Mysql(我已更新该帖子以包含此信息)。我不知道差异命令,我会看看这个谢谢你。 – mh1

回答

0

以为我会回答这个包裹没有人有同样的问题,我们发现,在回答我们的问题是,我们在设置中我们对数据库

mysqli_query($conn, "SET COLLATION_CONNECTION = 'utf8_unicode_ci';"); 

或者在笨联系以下。

$db['slave']['dbcollat'] = 'utf8_unicode_ci'; 

但是我们的表被设置为使用latin1的,而不是UTF8,只要我们拿出这个设置我们5+分钟查询完全停止,并在相似的时间到主跑了。 希望这可以帮助未来的人。

相关问题