2012-10-26 40 views
0

我遇到以下情況,其中搜索返回userid值列表(1,2,3,4,5,6等)如果要再次運行搜索,結果保證會在一段時間後改變。但是,我需要存儲將來要使用的搜索結果實例。存儲將來使用的搜索結果

我們有一個當前實現(legacy),它使用條件爲search_id創建一條記錄,並將返回的每一行插入與關聯的search_id不同的表中。

table search_results 
    search_id unsigned int FK, PK (clustered index) 
    user_id unsigned int FK 

這是一種不可接受的方法,因爲此表已經發展到數百萬條記錄。我考慮過對錶格進行分區,但是我會有很多分區(1000s)。

我已經優化了搜索結果過期的現有表格,除非它們在其他地方使用,因此所有搜索結果都在其他地方引用。

在當前架構中,我無法將結果存儲爲序列化數組或XML。我期望有效地存儲搜索結果信息,以便可以在不受記錄數量影響的情況下高效訪問它。

編輯:謝謝你的答案,我沒有任何問題自己運行搜索,但搜索結果集在這種情況下用於收件人列表,這將反覆使用,存儲的目的恰恰是在給定的時間有數據的快照。

回答

2

答案是不存儲查詢結果。這是一個可怕的主意!

  • 據介紹statefulness,這是非常糟糕的,除非你真的真的真的)需要
  • 它不是scalable(如你發現了)
  • 的數據是陳舊只要它被存儲起來

正確的方法是修復您的查詢/數據庫,使其快速運行。

如果您無法使用更好的SQL和/或索引等更快地查詢,我推薦使用lucene(或任何基於文本的搜索引擎)並將數據庫非規範化到其中。 Lucene查詢速度非常快。


我最近做的正是這種在一個大網站,是做你在做什麼:它是從緩存中會話對象的生產關係型數據庫的查詢結果,企圖最高車速可達查詢,但它是一團糟,而且速度也不快 - 在我之前,一位「高級」java開發人員(名字以Jam開頭,最後以.illiams結尾)實際上是一個白癡,他認爲這是一個好主意。

我把Solr(一個java定製的lucene實現)放在Solr中,並且保持Solr與關係數據庫保持同步(使用工作隊列),並且web查詢現在只有幾毫秒。

+0

不能同意你更多 –

0

是否有一個原因,你需要存儲每一個搜索?當然,你會希望爲用戶提供最新的信息?

我承認第一,這不是一個很好的解決方案。

  • 設置另一個數據庫旁邊您當前的一個[SYS_Searches]
  • 保存腳本可以使用SELECT INTO [SYS_Searches] .Results_ {} SEARCH_ID
  • 檢索可以做一個簡單的腳本選擇匹配的出表。

優點:

  • 每個搜索被整齊地裝到它自己的表,[最好在另一個DB]
  • 檢索查詢非常簡單
  • 檢索時間應該是很快速,沒有大規模的桌面掃描。

缺點:

  • 您將有* Y搜索用戶可以存儲每x用戶的表。

這可能會非常迅速地變得非常愚蠢,除非管理涉及到過期結果或用戶只能有1個緩存搜索結果集。

不漂亮,但我想不出另一種方式。