2012-04-04 75 views
-1

我試圖從20多分鐘的運行時間得到一個報告,我已經跟蹤了這個使用5個連接和3個子查詢來返回所有結果的mysql查詢的怪物的瓶頸數據集。到目前爲止,我的大瓶頸似乎是:在支付表上加入股票表是stock.id與payment.stock_id匹配,並且payment.type是此類型,而payment.status是此狀態。我正在慢慢地將其分解爲各種查詢,並讓Java決定保留哪些記錄並丟棄,但我想知道是否有一種有效的方法來獲取一些結果集,可能是存儲在內存中的表,然後查詢反對那些?我的一些結果集相當大,在最壞的情況下有幾十萬條。高效的mysql查詢

在此先感謝

+2

成千上萬的行肯定不小,但它實際上並不那麼大。無論如何,你可能想發佈實際的查詢。 – 2012-04-04 17:37:31

+1

我建議你調整查詢。使用[Explain](http://dev.mysql.com/doc/refman/5.0/en/explain.html)獲取查詢操作的初始視圖。您可能需要確定幾個索引等。從長遠來看,將這種過濾應用於應用程序通常是一個糟糕的主意。 – aishwarya 2012-04-04 17:40:02

+1

表格定義... – Kieveli 2012-04-04 17:40:04

回答

0

你創建的一些選擇物化視圖,讓您可以在一個時間間隔運行它,但你已經基本上在你的數據的有效性的延遲效果。但肯定會更快。

二是索引加入列。

子選擇通常比JOIN更昂貴,因此請嘗試將您的子選擇合併到聯接中。

有很多SQL優化書在那裏值得一讀,這些問題處理。但是不知道你的數據庫或模式或索引以及連接和子查詢如何。它幾乎就像在黑暗中捕捉一個球。

+0

謝謝。現在的方式,我幾乎是唯一的開發者,我繼承了代碼,沒有人維護數據庫,我懷疑任何人都會。儘管這不是一個好的長期解決方案,但我可能只是將處理過程轉移到應用程序中,因爲它似乎現在變得更好了。我從上面的指導幾乎總是「只需要一個樂隊援助」。 – coffeeNjava 2012-04-04 19:12:54

+1

不好意思聽到這個消息,但是在上面寫上繃帶通常意味着你以後會再次撓頭,要求怎麼包紮繃帶。但其總是歸結爲成本的修復與忽視成本。 – Churk 2012-04-04 19:15:43