2011-09-04 124 views
3

在我們的一個應用程序中,我們需要保存一些普通的表格數據,我們需要能夠在其中一列執行用戶端自動完成。Solr與MySQL性能的自動完成

我們想出的最初解決方案是將MySQL與Solr耦合以實現這一目標(MySQL保存數據,Solr保存標記化列並返回id)。但最近發生了一些不愉快的事情(開發人員開始將一些數據存儲在Solr中,因爲MySQL表格及其所做的操作都不是Solr無法提供的),我們認爲也許我們可以將它們合併在一起並消除其中的一個。

因此,我們不得不之一:(1)所有的數據移動到Solr(2)使用MySQL自動完成

(1)聽起來可怕,所以我給它(2),我開始與裝載了一槍將單列數據導入MySQL,禁用MySQL和Solr上的所有緩存,編寫了一個能夠在兩個數據庫上執行非常類似查詢的小型web應用程序[1],並針對本地和類似環境啓動了一些JMeter應用場景。結果顯示Solr有2.5-3.5倍的優勢,但是,我認爲結果可能完全錯誤且容易出錯。

所以,你會建議爲:

  1. 正確基準測試這兩個系統,我相信你需要 提供類似[MySQL的]環境JVM。
  2. 設計這個系統。

感謝您的任何線索。

[1]在MySQL上的SELECT column FROM table WHERE column LIKE 'USER-INPUT%'和在Solr上的column:"USER-INPUT"

回答

14

我最近將一個網站從數據庫中獲取數據(postgres)轉移到了從Solr獲取所有數據。難以置信的速度差異。我們在澳大利亞郊區也有自動完成功能(大約有15K),它在幾毫秒內就可以找到它們,所以ajax自動完成(我們使用jQuery)幾乎立即做出反應。

所有更新都是針對原始數據庫完成的,但我們的網站是一個大部分閱讀網站。我們使用觸發器在更新記錄時觸發事件,並將索引生成到記錄的Solr中。

另一大速度改進是呈現項目所需的預緩存數據 - 也就是說,我們在Solr索引時間對數據進行非規範化並預先計算大量內容,因此網頁工作人員可以很容易地進行渲染並且速度非常快。

另一個優點是,如果數據庫因某種原因需要離線時,我們可以將我們的網站置於只讀模式 - 我們只需回到Solr即可。至少該網站沒有完全停下來。

我會推薦儘可能使用Solr,以提高速度和可伸縮性。

+0

這聽起來不錯。我對Solr相當陌生,你可以在桌上做JOIN和GROUP BY嗎?我們在這張表中的數據是500萬條記錄。你還會建議使用Solr嗎?謝謝! – parsa

+0

Solr有一個鬆散的模式,所以一切都存儲在一個SINGLE表中。每個solr核心(索引)對應一個數據庫,而不是一個表。至於「GROUP BY」請查看刻面。 http://wiki.apache.org/solr/SolrFacetingOverview。 – aitchnyu

+2

@parsa solr可以容納龐大的數據集。沒有加入的概念。本質上,你索引solr「文檔」(只是一堆字段/值對),所以你需要非常規的非規範化,所以你需要渲染的所有東西都保存在文檔中。不要擔心文檔太大或重複數據 - 這完全取決於速度! – Bohemian