2011-04-09 104 views
6

我試圖迭代地優化一個慢的MySQL查詢,這意味着我運行查詢,獲取時間,調整它,重新運行它,獲取時間等。問題是時間不固定,以後查詢的執行與以前的執行完全不同。如何迭代優化MySQL查詢?

我知道在執行過程中清除查詢緩存或將其關閉。我也知道,在某種程度上,操作系統會以MySQL無法控制或理解的方式影響查詢性能。但是總的來說,我可以做這種迭代查詢優化的最好方法是什麼,以便我可以將蘋果與蘋果進行比較?

+2

你嘗試過'SELECT SQL_NO_CACHE ...'嗎?這通常足以使查詢在多次運行中運行時間穩定。 – Galz 2011-04-09 20:20:57

+0

我沒有,我會的,然後我會回報。謝謝。 – shanusmagnus 2011-04-10 17:07:15

+0

好吧,試過了 - 沒有效果。在最初的查詢之後,性能提升開始後,查詢速度會更快。但是,謝謝你的提示,這將有助於瞭解其他情況。 – shanusmagnus 2011-04-11 02:00:21

回答

2

您的最佳查詢優化工具是EXPLAIN。這將需要learn what the output means一點點,但這樣做後,你會明白MySQL的(可怕的,破碎的,向後)查詢計劃器決定如何最好地檢索請求的數據。

將參數更改爲查詢可能會導致截然不同的查詢計劃,因此這可能會解決您所看到的一些問題。

您可能想要考慮​​以捕獲全部查詢可能運行的性能低下。也許你會發現,在使用某些參數時,有問題的查詢只屬於低性能類別?

+0

感謝關於EXPLAIN的提示 - 這將是一個很大的幫助。我已經仔細檢查了慢速查詢日誌,我想也許這最終會成爲我需要更加努力的事情:建立一個慢速查詢語料庫,然後在批處理中運行它們,希望那些能夠找到他們的方法進入慢速查詢日誌是非常不同的,以產生性能強大的緩存效果,我在我的評論中描述的緩存效果(下面) – shanusmagnus 2011-04-10 17:06:15

+0

@shanusmagnus,如果這僅僅是磁盤塊緩存(或缺乏)的結果,您應該檢查MySQL配置以確定它是否已針對該硬件的性能進行了調整,以確定給定的數據庫大小。 Percona的[MySQL性能博客](http://www.mysqlperformanceblog.com/)可能會令你感興趣。 – Charles 2011-04-10 17:09:58

1

創建一個運行查詢1000次的腳本,或任何數量的迭代導致結果穩定。

然後如上所述按照您的流程進行操作,但只要確保您不依賴單個執行,而是平均執行多次執行,因爲您是對的,結果將不會穩定,因爲行數會發生變化,你的機器正在做其他事情。

另外,如果這對您的用例有意義,請嘗試將大量的輸入用於查詢。

+0

這是一個很好的建議,但遺憾的是,在我的特殊情況下,單個查詢在後續查詢中的執行時間從25秒到700毫秒不會有幫助。很明顯,緩存在工作,似乎是相關磁盤塊上的OS級緩存。 「完全不同」的相同類型的查詢可以將執行時間降低到25秒範圍,但這不是微不足道的,自動創建的查詢與通過這種方式運行系統的查詢完全不同。 – shanusmagnus 2011-04-10 17:04:18