2012-02-24 66 views
9

我在我的mysql數據庫中有數百萬條記錄。我在Rails 3中爲iPhone應用程序實現了一個正常的REST API,但SAYT功能響應非常慢。搜索數據庫並返回結果需要很長時間。我怎樣才能提高性能?如何在Rails 3應用程序中實現更快搜索(Rails 3應用程序中鍵入(SAYT)api)

我已經索引了我的表格。 什麼方面我應該更像MySQL調優,或者我應該使用rails sphinx還是太陽黑子?有幫助請幫助我所有的專家意見。

+0

你能分享一點信息嗎?你搜索了多少列?什麼類型的字段?你可以分享你現在使用的查詢嗎?你一定要看看全文搜索引擎,彈性搜索是另一個好的搜索引擎:http://railscasts.com/episodes?search=search – fatfrog 2012-02-25 03:10:01

+0

速度慢有多慢?你可以發佈一個搜索請求的軌道開發日誌的要點嗎?你的問題的答案很大程度上取決於是否大部分時間用於查詢數據庫,返回結果,還有其他內容,等等。 – carols10cents 2012-03-02 21:49:23

回答

1

我不確定通過添加更快的搜索來表示您的意思,但將觸摸可用性的搜索結果限制爲100是很好的做法。沒有多少用戶會搜索100條記錄。

爲了實現這樣的搜索,我建議你包含關鍵字表。關鍵字表應由記錄標識和與其關聯的關鍵字以及該關鍵字在數據庫中進行處理的次數組成。

因此,它將幫助您確定前百名記錄和最準確的搜索。

同時運行的Map Reduce也有很多搜索算法。我不認爲你的移動設備技術可以處理地圖縮減。

+2

對於移動設備上的結果的第一頁,我會說5-10個結果很多,甚至。 – carols10cents 2012-03-02 21:50:27

1

我也推薦使用像Sphinx這樣的全文搜索引擎。

有關於使用獅身人面像和導軌與thinking_sphinx寶石良好的截屏:

Railscast thinking_sphinx gem

隨着創業板也可以影響有關通過例如重要的搜索結果添加字段權重:

由於它是一個移動設備,我會以及保持發送給移動到minmum作爲MADI媒體鏈接提到結果的ammount的。

玩得開心

0

取決於你做什麼的查詢,匹配在列的開頭是LIKE查詢可以使用索引(從Postgres我肯定知道,他們這樣做;在MySQL中我不知道)。

所以,

Widget.where('name LIKE ?', "#{search_term}%").all 

將使用(至少在Postgres的)數據庫索引,而

Widget.where('name LIKE ?', "%#{search_term}%").all 

不會。請注意搜索詞開頭的%。您的行駛里程也可能會隨着ILIKE(不區分大小寫)和LIKE(區分大小寫)而變化。閱讀數據庫文檔。這可能是最低的成果。

由另一個回覆提出的搜索引擎是另一種選擇。如果您部署在Heroku上,則有一些雲端搜索附加組件可以非常容易地進行整合,但它可能比調整您的查詢稍微多一點點。

1

爲了快速搜索數百萬條記錄,您可能要使用trie類型的數據結構。如果你想獲得一些幫助,http://en.wikipedia.org/wiki/Trie有ruby示例代碼。

簡化了一下,trie是一種高度存儲高效的方法,用於跟蹤哪些孩子屬於哪些初始字符列表。

本質上,您的SAYT技術會接收一個字符串,並返回字符串的trie的條目前15個左右的結果。

根據行的自相似程度,當然這會影響你的RAM使用。

0

你可以製作一個大多數搜索的表格,然後優先搜索這種方式也許,希望這有助於。

2

我同意一般的答案:使用像Sphinx這樣的搜索引擎(並限制返回結果的數量);他們被設計爲完全按照你的意願去做。

然而,儘管數百萬條記錄聽起來很多,但您應該首先確定需要很長時間的事情。我對Sphinx和ThinkingSphinx很有愛 - 他們採取了一個相當複雜的過程,使其變得非常簡單和容易。但是,最終,搜索引擎是另一個管理,配置,學習和認識的系統。如果你不必去那裏,不容易,不是嗎?

這可能是查詢,它可能是花時間返回數據(limit是你的朋友!)。或者這可能是因爲您每秒獲得數百個請求,也許是因爲自動完成的延遲太短short - 如果在每個字符上都進行查找,快速打字員或多個用戶可以輕鬆地使用查詢超時服務器這對用戶不提供任何實用性。

觀看Rails日誌,看看到底發生了什麼。如果這是一個簡單的查詢性能問題,那麼做一個複雜的全文搜索,那麼,是的,這將是緩慢的,獅身人面像將是值得的努力。你的數據庫有一個explain工具,通過一些工作,可以幫助你理解數據庫在做什麼來獲得結果。索引不被使用的情況並不少見。

什麼是緩存? Memcached是一個很棒的工具。或者甚至只是數據庫的緩衝區大小設置可以允許它使用更多內存進行緩存。