2013-07-09 45 views
1

我有一個MySQL查詢,需要8秒執行/獲取(在工作臺)。如何緩存不經常更改的mysql查詢?

我不會去到爲什麼它可能是緩慢的細節(我認爲GROUPBY心不是幫助,雖然)。

我真正想知道的是,我怎麼能基本上緩存它更快地工作,因爲這些表只改變像5-10次/小時,而用戶訪問該網站1000次/小時。

有沒有辦法,只是有結果再生/緩存時這樣的結果分貝的變化不經常再生?

我很新的sql所以任何基本思想可以很長的路要走。

+0

如果你有你的mysql數據庫的配置直接訪問,你可以檢查是否'查詢Cache'([查詢高速緩衝如何工作(http://dev.mysql.com/doc/refman/5.1/en /query-cache-operation.html))處於活動狀態,並且可以針對您的用例進行優化。降低MySQL調用另一種方法是緩存結果在您的應用程序,這樣你 - 根據使用情況 - 也可以緩存與該結果進行後處理。 (我個人喜歡第二個,因爲我對數據緩存的方式和位置有更多的控制)。 –

回答

0

我不熟悉MySQL中的這種緩存工具。有替代品。

一種機制是使用應用程序級緩存。應用程序將存儲以前的結果並在可能的情況下使用。請注意,這對多個用戶來說並不適用。

你可能想要做什麼是存儲在一個單獨的表中報告。然後你可以每五分鐘左右運行一次。這將是一個使用作業調度程序來運行作業的簡單機制。

這方面的一個變種就是有一個存儲過程,首先檢查數據是否已經改變。如果基礎數據已更改,則存儲過程將重新生成報告表。存儲過程完成後,報表將保持最新狀態。

另一種方法是使用觸發器,只要基礎數據發生變化。觸發器可以運行查詢,將結果存儲在表中(如上所述)。或者,觸發器可以更新報表中可能發生變化的行(更困難,因爲它涉及瞭解報表背後的業務邏輯)。

所有這些都需要對應用程序進行一些更改。如果您的應用程序查詢存儲在視圖中(類似於vw_FetchReport1),則更改很簡單,全部在服務器端。如果查詢嵌入到應用程序中,則需要用其他方法替換它。我強烈建議使用視圖(或在其他數據庫中使用用戶定義的函數或存儲過程)進行數據庫訪問。這爲數據庫應用程序定義了API,並極大地方便了此處所述的更改。

編輯:在MySQL(在響應評論)有關排定作業

更多信息here。我期望的SQL代碼是這樣的:

truncate table ReportTable; 

insert into ReportTable 
    select * from <ReportQuery>; 

(在實踐中,您將包括在selectinsert報表列清單)

+0

我在數據庫中使用「例程」。對應用程序級別更改不感興趣。但你能在闡述如何我可以運行查詢每隔5分鐘,結果存儲在一個單獨的表。你真的只是意味着我應該完全創建一個新表?如果是的話是有辦法讓它只讀取一次創造出來的? – glutz

0

一個簡單的解決方案,可用於實現高速化長時間運行查詢的響應時間是基於基礎數據刷新或業務需求定期生成彙總表。例如,如果您的業務不關心次分鐘「準確性」,那麼您可以每分鐘運行一次流程,並使您的用戶界面查詢此計算表,而不是在線彙總原始數據。