2012-07-27 33 views
4

我目前正在開發兩個嚴重依賴MySQL數據庫的iOS應用程序。他們每個都有自己的API,這是由相應的應用程序請求的,它運行相關的查詢請求來自MySQL數據庫的數據。爲什麼使用MySQL數據庫緩存?

這些查詢被基於簡單,用戶或 '對象' 而變化:

SELECT `username`, `id`, `full_name` FROM `users` WHERE `id` = 1 
INSERT INTO `users` (`full_name`, `username`, `email`, `password`, `signup_method`, `latitude`, `longitude`) VALUES (?, ?, ?, ?, ?, ?, ?)" 
SELECT q.*, (SELECT COUNT(a.qid) FROM answers as a WHERE qid=q.id) AS a_count FROM questions as q ORDER BY a_count DESC LIMIT 1, 10 

到基於位置的:

SELECT (6371 * acos(cos(radians(?)) * cos(radians(latitude)) * cos(radians(longitude) - radians(?)) + sin(radians(?)) * sin(radians(latitude)))) AS distance FROM `users` HAVING distance <= 5 ORDER BY points DESC 

SELECT * , (6371 * acos(cos(radians(latitude)) * cos(radians({$values['latitude']})) * cos(radians({$values['longitude']}) - radians(longitude)) + sin(radians(latitude)) * sin(radians({$values['latitude']})))) AS distance FROM `questions` HAVING distance <= ? ORDER by distance LIMIT ?,? 

這些查詢顯然需要時間。特別是後者由於其引起的性能強度。

許多服務在其數據庫旁邊使用緩存層來提高性能。 E.g:

  • Memcachd
  • Redis的
  • 多。

我的問題是,何時應該使用緩存,以及使用緩存有什麼好處?

謝謝,

Max!

回答

4

您應該在緩存便宜時緩存,而不是從頭開始生成結果。

這個成本取決於事情,如:各種服務器和軟件的

  • 處理能力。也許你的數據庫服務器容量有限,但在另一臺服務器上容量過剩。
  • 錢:購買更強大的硬件比構建緩存系統更便宜嗎?
  • 產生從頭開始的結果與高速緩存的RAM成本的CPU成本。大多數情況下,DB服務器是CPU綁定的,而緩存服務器是內存綁定的。這是爲了讓你決定在你的情況下升級哪個更便宜。
  • 從緩存中檢索的速度與從db中檢索的速度。如果像你說的那樣,查詢花費時間,並且從緩存中獲取它們更便宜,緩存將加速你的請求。
  • 需要刷新緩存項目的頻率。如果他們只持續幾秒鐘,這可能是不值得的麻煩。
  • 有一個方法來過期和刷新緩存的項目。這通常是一個非常困難的問題。
  • 具有技術知識和時間來管理額外的複雜性。

但總是從源頭開始。你是否檢查過MySQL的慢查詢日誌,看看哪些查詢代價高昂?它可以幫助您查看缺少重要索引的位置,以及哪些查詢意外地花費很長時間。來自Percona-Toolkit的[pt-query-digest]1可以通過彙總此日誌文件來提供幫助。在開始緩存之前優化您的數據庫。

看看你的查詢類型,在我看來,緩存結果甚至預熱緩存是非常值得的。

緩存的選擇當然是一個重要的選擇。我假設你已經在使用MySQL的內置查詢緩存?確保它已啓用並且分配了足夠的內存。簡單的查詢,如'SELECT username',無論如何都很便宜,但也很容易被MySQL自己緩存。儘管內置查詢緩存有很多限制,並且查詢不被緩存或緩存被刷新的原因很多。例如,具有函數的查詢(如您的基於位置的查詢)會被略過。閱讀文檔。

使用類似Redis的緩存可以更好地控制要緩存的內容,時間以及如何過期。關於如何實現這一點有很多想法,它們也取決於您的應用程序。看看網絡。

我會建議啓用查詢緩存,只是因爲它很容易,便宜並且會有所幫助,而且我肯定會考慮爲您的數據庫實現內存中緩存層。也許索引服務器,如Solr,它具有內置的基於位置的查詢方法,值得考慮。我們與MySQL一起使用它。

Memcached和Redis是緩存的不錯選擇。我個人選擇Redis是因爲它有更多的用例和可選的磁盤持久性,但這完全取決於你。也許你的選擇框架有一些你可以在你的應用程序中使用的現有組件。

另一個提示:衡量一切。如果你知道需要什麼時間,你只知道要優化或緩存什麼。此外,如果您再次進行測量,您的優化結果纔會清晰。實現類似statsd的東西,並測量應用程序中的各種事件和時間。比不夠的更好。記錄結果並分析它們隨着時間的推移。你會驚訝什麼出現。

+0

這真是一個很好的答案。 +1 – Fluffeh 2012-07-28 02:08:46

+0

謝謝。儘管擴大了一點。 :-) – 2012-07-28 02:16:32

+0

明智的答案,令人難以置信的詳細和重點。非常感謝花時間回答! – 2012-07-28 02:25:24

0

緩存允許您比使用MySQL查詢更快地訪問數據庫,因爲它們非常耗時。在大多數情況下,當Web應用程序變大時,數據庫將成爲其最大瓶頸,由於查詢速度很快導致大量備份。因此,許多網站和公司都將緩存作爲一種快速且簡單的方式來提高從數據庫訪問信息的速度。我會說,在開發的早期階段不要擔心它,而是在你有一個可用的alpha網站時嘗試一下。