2012-12-19 69 views
1

我的網站提供了大量的標記和分類內容,並且我試圖創建一個強大的算法來將內容與用戶需求連接起來。用戶可以選擇他們最感興趣的標籤,並且與這些標籤匹配的內容被賦予更高的優先級。此外,內容可以被「喜歡」(優先推動),時間衰減優先推倒。因此,最終,用戶應該看到與他們感興趣的內容相對應的相對較新的內容,並且也受其他用戶的歡迎。優化從一個非常大的MySQL表中提取數據的算法

目前的算法是這樣的:

  1. 拉離content表中的所有項目。指定每個項目的得分爲1.
  2. 檢查content_tagsuser_tags以查看從步驟1拉出的數組中是否有匹配項。如果是,請將乘數應用於該項目的得分。
  3. 查看content_likes查看每件商品有多少喜歡的商品。根據此金額應用另一個乘數。
  4. 根據項目的時間衰減應用第三個因子。顯然,較舊的物品會受到比新物品更大的懲罰。
  5. 按總分數排序。結果數組首先應該有最相關的項目。然後,我可以簡單地將此數組修剪到20個左右的項目,並將其顯示在頁面上。

正如你可能會說,這是一個緩慢的算法,它不僅需要運行一個查詢拉每一塊內容,但隨後它具有運行單獨的查詢檢查content_tagsuser_tagscontent_likes。查詢太多!

我想我的第一個問題是:我做這一切都錯了嗎?除此之外,你能想出任何方法來優化我上面總結的所有內容嗎?算法本身工作得很好,假設項目和用戶都有相關的標籤。但是我擔心,當我的桌子增長到數以萬計的項目時,我會陷入一片混亂。

感謝您的幫助!

+0

問:你能想出任何方法來優化我上面概述的所有內容嗎?答:設計您的數據庫模式 - 並創建數據庫索引 - 進行高效查詢。 – paulsm4

+0

你爲什麼不跟蹤每個內容的分數?然後你就沒有經歷過所有這些,只需要爲內容抽取分數就很容易。 – kennypu

+0

我認爲跟蹤評分的問題在於,它會根據每個用戶的偏好而改變。如果它只包含喜歡和時間衰減,我可以保持分數,但用戶標籤增加了複雜度的新維度。 –

回答

2

使用許多查詢會減慢頁面的速度。 嘗試將它們組合成儘可能少的數字,並且請在你的mysql表上使用索引!你會注意到創建索引肯定會影響你的頁面加載時間。