2014-07-04 40 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+分鐘查詢完全停止,並在相似的時間到主跑了。 希望這可以幫助未來的人。

相關問題