2011-11-29 17 views
0

我通過開發一個Web應用程序約70%的方式,其中包含本質上大約50,000行的大數據。什麼是最適合此應用程序的數據庫緩存?

該應用程序本身是一個過濾應用程序,提供過濾此表的各種不同方式,例如按數字範圍過濾,拖放過濾,最終執行正則表達式過濾,實時文本搜索以及我可以繼續。

由於這個原因,我以模塊化的方式對我的MySQL查詢進行了編碼,以便實際查詢本身根據過濾類型進行動態組合。

目前,每個過濾操作(總共)平均需要250-350ms。例如: -

用戶抓住可視滑塊的一端,向內拖動,當他/她放開時,範圍過濾查詢由我的PHP代碼動態放在一起,結果作爲JSON響應返回。用戶放開滑塊直到用戶收到所有數據並重新繪製表格的總時間平均在250-350毫秒之間。

由於用戶可以在短時間內執行大量篩選操作以檢索他們正在查找的數據,因此我非常關注可擴展性。

我已經試圖用memcached做一些奇特的緩存過期工作,但無法讓它與我的動態生成的查詢正確地玩球。儘管所有內容都可以正確緩存,但是當查詢更改並保持數據相關時,我無法在緩存中過期。然而,我對memcached極其缺乏經驗。我的第一次嘗試讓我相信,memcached並不是這項工作的正確工具(由於查詢的高度動態性,儘管這個應用程序最終可以看到非常高的併發使用率。我的問題是,有沒有緩存機制/層,我可以添加到這種應用程序,可以減少在服務器上的點擊量?記住動態查詢。

或...如果memcached是最好的工具對於這份工作,我錯過了早期嘗試的一部分難題,能否提供一些關於如何使用memcached的信息或指導?

巨大的感謝所有誰res池塘。

編輯:我應該提到的是數據庫是MySQL。 siite本身使用nginx代理在Apache上運行。但是這個問題純粹與加速和減少數據庫命中有關,其中有很多。

我還應該補充說,250-350ms的往返時間是完全遙遠的。就像從遠程計算機訪問網站一樣。時間包括DNS查找,數據檢索等。

回答

1

如果我正確理解你的問題,你基本上要求一種方法來減少對數據庫事件的查詢次數,儘管只有很少的完全相同的查詢。

您基本上有三種選擇:

  1. 直播具有抗數據庫大量的查詢,優化與適當的索引數據庫,並儘可能就可以恢復正常的數據。確保避免查詢構建中的常見性能問題(例如,在ON子句或WHERE子句中有大量的OR)。爲混搭查詢提供視圖等。
  2. 在memcached或類似中緩存通用查詢,即沒有部分或全部過濾器。並在應用程序層應用過濾器。
  3. 實現搜索索引服務器,如SOLR。

我會建議你先做第一次。即使對於複雜的查詢,250到300毫秒的往返時間聽起來有點高,並且聽起來好像你在現階段只需改進已有的東西就可以獲得很多好處。 對於更高的工作負載,我建議第3號解決方案,它將幫助您在處理大量不同查詢時成爲冠軍的同時,幫助您實現所要做的。

+0

這裏有一些很好的簡單方法,我本可以把答案給予任何人,但是你的回答激發了我放下自己的驕傲,更努力地設計我的實際數據庫和查詢。謝謝。 – gordyr

0

使用Memcache並將密鑰設置爲基於過濾器的過濾查詢或某個唯一密鑰。理想情況下,您會編寫應用程序,以在添加新數據時過期。

0
  1. 只有偶爾運行相同的查詢時,才能充分利用緩存。
  2. 使用memcache緩存的一個好方法是定義一個與調用它的函數匹配的鍵。例如,如果名爲UserModel的模型的方法爲getUser($userID),則可以將所有用戶緩存爲USER_id。對於更高級的功能(Model2::largerFunction($arg1, $arg2)),您可以簡單地使用MODEL2_arg1_arg2 - 這將避免命名空間衝突。
  3. 要進行全文搜索,請使用搜索索引器,例如Sphinx或Apache Lucene。他們改進了您的查詢(我能夠在不到500毫秒的時間內在1.6 GHz原子處理器上的1000萬張記錄表上進行全文搜索)。
相關問題