我有很久以前開發的這個大型的MySQL查詢。它遠非完美,現在是優化它的時候了。我甚至不知道從哪裏開始,可能會在涉及的表中添加索引?或者將查詢分解爲子查詢,將它們存儲爲視圖,然後使用這些視圖重新組合結果? 請告訴我你將如何處理此類任務。MySQL怪物查詢優化
鏈接查詢: http://pastebin.com/sVvW8PCc
使用的MySQL版本:5.0.96
目前,它加載在像6,5秒鐘,我看這個時間縮短到2秒或更少。
預先感謝您!
我有很久以前開發的這個大型的MySQL查詢。它遠非完美,現在是優化它的時候了。我甚至不知道從哪裏開始,可能會在涉及的表中添加索引?或者將查詢分解爲子查詢,將它們存儲爲視圖,然後使用這些視圖重新組合結果? 請告訴我你將如何處理此類任務。MySQL怪物查詢優化
鏈接查詢: http://pastebin.com/sVvW8PCc
使用的MySQL版本:5.0.96
目前,它加載在像6,5秒鐘,我看這個時間縮短到2秒或更少。
預先感謝您!
如果你沒有索引,那就先做。
它看起來像你在每個UNION中使用相同的查詢,只是改變通配符(換句話說,連接都是相同的,只有通配符是不同的。)如果是這樣,專注於UNION的1部分只有(例如,WIND)並確保儘可能有效地運行。然後,您可以將更改複製到其他人。
我會懷疑(如果前面的陳述是真的),您可以通過使用SELECT
子句中的CASE
語句將UNION查詢合併爲一個查詢。 (您還需要使用GROUP BY)
您經常會確定MAX(d_updated)。我不確定MySQL是否緩存了這個結果,或者每次嘗試確定它的結果。爲什麼不在執行此查詢之前確定一次值,然後將其作爲硬編碼值發回您的查詢中?
最後,我會推薦使用視圖,不是爲了性能,而是爲了可讀性。
只需添加索引就可以將時間從6,5秒縮短到不到1秒。謝謝你的回答。 – Vasily802
請顯示來自EXPLAIN的輸出。 –
哇 - 從哪裏開始?我會首先刪除所有子查詢 - 爲什麼你不能只加入連接? (SELECT MAX(d_updated)FROM table_d),INTERVAL 1 DAY))))));}} AS table_d1 ON Ticker = Ticker1「可以是」LEFT OUTER JOIN table_d as table_d1 ...「。 –
有關此查詢的EXPLAIN聲明位於此鏈接之下:https://docs.google.com/spreadsheet/ccc?key=0At34xVWtnIMWdHpTMkFfTzUtRi0wX1ZQb3BxX3V1aVE&usp=sharing – Vasily802