2011-07-07 133 views
1

我正在處理用戶提供參數的Web應用程序,這些應用程序用於生成高達2000萬行數據庫中前1000個項目的列表。我一次需要所有1000個項目,而且我需要從用戶的角度來看,這個排名或多或少地立即發生。快速處理大量數據

目前,我正在使用一個具有用戶定義函數的MySQL對數據進行評分和排名,然後PHP從那裏獲取它。在1M行的數據庫上測試,這需要大約8秒鐘,但我需要大約2秒的性能,即使對於高達20M行的數據庫也是如此。優選地,該數量應該更低,以便可以保證50個併發用戶的體面吞吐量。

對於任何可以使用任何能夠儘可能有效地處理這些數據的軟件,無論是否是MySQL,我都樂於接受任何流程。以下是過程的功能和限制:

  • 與評分過程相關的每行數據大約爲每個項目50個字節。
  • 插入和更新數據庫是微不足道的。
  • 每個分數都是獨立於其他分數的,因此分數可以並行計算。
  • 由於大量的參數和參數值,分數不能預先計算。
  • 該方法應該可以很好地適用於多個併發用戶
  • 就服務器數量而言,需要的計算資源越少越好。

由於

+0

你正在處理什麼樣的數據(整數,字符串等?)?你的評分算法是什麼?你正在進行任何加入? –

回答

1

一種可行的方法似乎是對所有的數據加載(和更高版本的更新)到約1GB RAM和執行得分和如C++語言的MySQL排名外面。這應該比MySQL更快。

評分必須相對比較簡單,因爲您的要求僅留下每行十分之一微秒的評分和排名而無需並行化或優化。

+0

得分算法基本上是一大堆數學,所以這看起來就像是要走的路。幾天前,我幾乎得出了這個結論,但很高興看到它被外界的意見所證實,因爲它需要很多工作才能做到這一點。接下來,我需要研究如何在緩存性能,向量化等方面優化這種策略。 – acjay

0

如果你可以發佈查詢,你有問題可以幫助。

雖然這裏有一些東西。 確保你有在數據庫上創建的索引。 確保使用優化的查詢並使用連接而不是內部查詢。

+0

它基本上是一個大的選擇,所以沒有太多優化那裏 – acjay

-1

對於這樣的問題,如果您已經完成了所有明顯的軟件優化(並且我們無法知道,因爲您沒有提及任何關於您的軟件方法),您應該嘗試一些嚴重的硬件優化。最大限度地減少SQL服務器上的內存,並嘗試儘可能將表格放入內存中。爲您的表/索引存儲使用SSD,以實現快速反序列化。如果您是羣集的,請將網絡連接到最高可行的網絡速度。

+0

downvote的任何原因? –

0

根據您的標準,提高性能的可能性取決於您是否可以使用輸入條件預先過濾需要計算分數的行數。即如果其中一個用戶提供的參數自動使大部分行不合格,那麼首先應用該過濾將會提高性能。如果沒有任何參數具有該特性,則可能需要更多硬件或具有更高性能的數據庫。