2014-09-20 56 views
3

最近我一直在想很多關於優化的東西。考慮平衡服務器負載,內存,客戶端,負載,速度,大小等因素,我正在開發一款應用程序,使我能夠考慮在哪裏處理數據。優化:在哪裏處理數據?數據庫,服務器或客戶端?

我想更好地理解有經驗的程序員在思考時如何優化代碼關於處理。請採取以下3種方式:

  • 當我收到數據時,請在數據庫級別進行一些處理。
  • 在PHP上處理數據
  • 將原始數據傳遞給客戶端,並使用JavaScript進行處理。

你會喜歡哪一種?哪種情況?爲什麼?對於廣泛的問題,我很抱歉,如果有人能夠在此推薦我的好閱讀資源,我也會很感激。

回答

2

數據庫是任何應用程序的核心,因此您應該儘可能輕地保持數據庫上的負載。這裏有一些建議

  1. 只從數據庫中獲取必填字段。
  2. 兩個簡單查詢比單個複雜查詢要好。
  3. 從數據庫中獲取數據,使用PHP進行處理,然後將處理後的數據存儲到臨時存儲中(比如緩存,例如Memcache,Couchbase,Redis)。此數據應設置到期時間,到期時間完全取決於數據類型。緩存將在很大程度上減少數據庫負載。
  4. 數據以標準化形式存儲。但是,如果您事先知道數據將被請求,並且生成此數據需要從多個表中進行連接,則預先處理的數據可以存儲在單獨的表中,並可以從此表中提供。
  5. 在客戶端發送儘可能少的數據。較少的HTML大小將節省帶寬,瀏覽器將能夠快速呈現頁面。
  6. 按需加載數據(使用ajax,延遲加載等),例如圖像在頁面上不可見,直到用戶單擊選項卡,此圖像應在用戶單擊時加載。
1

因此,根據經驗法則,儘可能多地處理數據庫中的數據。爲查詢創建新連接的成本非常高,因此您想盡可能限制它。即使您必須編寫一些非常難看的SQL,執行JOIN幾乎總是會比執行2 SELECT語句更快。

PHP應該只能用於格式化和緩存數據。如果您在每次請求後執行大量數據操作,則可能是以不太實際的格式存儲數據。您希望使用類似Redis或APCu的東西來緩存任何未經常更改的任何服務器狀態。

最後,客戶端不應該對多個對象執行數據操作。您永遠不知道客戶端資源的可用性,因此始終保持客戶端數據精益。對後端大於幾十個數據集執行分頁和排序。使用AngularJS的AJAX請求通常與在iPad 2上對100多個項目執行排序一樣快。

如果您想了解此答案的任何方面的更多詳細信息,請詢問我將盡我所能提供的示例或其他細節。

2

兩個想法:電腦應該工作,人們應該思考。 (來自20世紀60年代的IBM廣告)

「不成熟的優化是編程中所有邪惡(或者至少大部分)的根源。」 --Donald Knuth

除非您或者計劃成爲Google或亞馬遜或Facebook,否則您應該關注功能。 「在你快速完成之前讓它工作。」如果你的計劃增長到這樣的規模,做他們所做的:拋出硬件的問題。它更便宜,更有效。

編輯添加:由於您控制服務器上的處理能力,但可能不在客戶端上,因此在服務器上執行強化任務通常會更好,尤其是在客戶端可能是移動設備的情況下。但是,請考慮網絡延遲,帶寬要求和響應時間。如果您可以通過在客戶端進行處理來縮短響應時間,那麼請考慮這樣做。所以,優化用戶體驗,而不是CPU週期;您可以在需要時購買更多的CPU週期。

最後,請記住客戶端不能被信任。出於這個原因,必須在服務器上。

相關問題