2009-11-04 47 views
0

SQL初學者在這裏。如何存儲SQL查詢結果以進行快速訪問?

我有一個需要大約10秒鐘才能運行的查詢,所以我們在應用程序中放慢了速度。

在MySQL或更一般的SQL中,服務器可以定期(每1到5分鐘)運行一次查詢並將其存儲在某處,以便我可以查詢此「緩存」表以便於訪問嗎?

非常感謝提前!

+1

發佈查詢,雖然性能不好表示有問題的數據模型... – 2009-11-04 02:48:12

回答

4

最有可能取決於您的查詢是什麼,您可以通過在您的表上創建缺失索引來加快查詢速度。將EXPLAIN EXTENDED放在查詢之前,查看它正在使用哪些索引,並嘗試確定應對哪些列進行索引。應該編入索引的列是where語句中的列,以及連接中使用的任何字段。如果您提供查詢和表格架構,我們可能會幫助推薦一些索引。

雖然可能有很多方法每隔5分鐘運行一個進程來填充臨時表(cron作業,計劃任務,從應用程序運行一個線程),但您最好先用盡索引選項採取這種可能只是使用更多資源的激烈措施。並不一定會提高應用程序的性能。

1

您的應用程序可能有一個喚醒的線程,查詢是否將結果保存到臨時表中,並且應用程序的其餘部分僅使用臨時表。

0

在MySQL中沒有這樣的調度規定。

但是,您可以始終運行預定作業(通過Windows上的at/scheduler,cron或您在Unix上使用的任何調度系統)來執行此類「執行並將結果插入登臺表」查詢/過程。

除了你的直接問題,還要考慮優化查詢 - 如果你還沒有這樣做,那麼對索引和/或重新設計表的審慎應用可能會加快它的速度(但我完全承認一些查詢已儘可能優化)

另一種解決方案是流式傳輸/分塊 - 讓應用根據需求檢索「接下來的N行」。

另外,考慮將查詢結果緩存在應用程序本身而不是DB中 - 這種方式緩存不需要數據庫訪問,甚至更快。

+0

是的。 Oracle已經實現了觀點。 – jle 2009-11-04 02:39:37

+0

看起來他們也可以在MySQL中使用。 – jle 2009-11-04 02:43:43

+1

物化視圖不能**預定**所以請收回你的downvote,因爲我是100%正確的。更不用說按照rexem的評論,他們在MySQL中是不可行的 – DVK 2009-11-04 02:47:02

0

授予此解決方案現在可能超出您的範圍。您可以使用ORM框架爲您執行緩存。基本上你要求的是爲你的結果提供緩存解決方案。緩存解決方案可能因您使用的供應商和語言而異。