2011-06-01 187 views
2

我有一個大型數據庫,其行數超過20,000行。我有兩個表歌曲專輯在Mysql數據庫中搜索字符串的速度更快

歌曲包含songid,ALBUMID,SONGNAME和表專輯包含ALBUMID,ALBUMNAME

目前,當一首歌曲的用戶搜索只要他開始打字,我會立即給出結果。就像Google Instant一樣。

我現在用的就是:每當用戶類型我發送查詢字符串到我的後端PHP文件,有我執行該查詢在我的數據庫是這樣的:

SELECT * FROM songs, albums WHERE songs.albumid = albums.albumid AND songs.songname LIKE '%{$query_string}%'; 

但它是非常低效的使用數據庫查詢每次,也不可擴展,因爲我的數據庫每天都在增長。

因此,我希望同樣的功能,但速度更快,效率和可擴展性。

而且,我不希望它是精確的模式匹配,例如:

假設,如果用戶鍵入「的Rihana」而不是「蕾哈娜」,那麼它應該能夠給出相關的蕾哈娜結果。

謝謝。

回答

1

首先,你應該找到MySQL的FULLTEXT搜索支持遠遠比你目前的方法快的。

我懷疑你會從這個解決方案和用於搜索錯誤拼寫的詞,你會更好調查某種更多特色全文搜索引擎的支持,喜歡那種速度。這些措施包括:

  • 獅身人面像搜索
  • Solr的
  • ElasticSearch
+0

感謝詹姆斯,我現在將使用帶索引的全文搜索。因爲我目前無法安裝這些搜索服務器。謝謝你的幫助。 – Kevindra 2011-06-01 09:34:18

1

嘗試full text search

索引雖然需要MyISAM表格。

如果您需要ACID和全文搜索,使用PostgreSQL

+0

謝謝丹尼斯,這對我們來說真的很有幫助。 – Kevindra 2011-06-01 09:33:22

2

你應該索引表歌曲SONGNAME的前n個字符列,說6,以獲取查詢更好的性能。

觸發只有經過n個字符已輸入的查詢搜索,說3(jQuery的自動完成有這個選項,例如)

您也可以考慮在內存中的DB如果性能是真正的關鍵(聽起來像是),並且數據量不會消耗太多駐留內存。

谷歌,順便說一句,不使用傳統的RDBMS來執行其荒謬快速搜索(不斷驚訝...)

+0

InnoDB可以選擇將數據集緩存在內存中,例如,如果使用InnoDB,則不需要內存引擎。另外,Google的體系結構與您對RDBMS的評論有什麼關係?這是計算的體系結構(將搜索任務分割到N臺計算機上,返回結果並將其聯合起來,提供給客戶端)。 – 2011-06-01 09:19:21

+0

可以請你告訴我如何索引前N個字符的歌名(varchar)。 ? – Kevindra 2011-06-01 09:32:17

+0

當然,只是在N個服務器上分割搜索,聯合並提供給客戶端(不是每個人都有N個服務器可用,可能是OP的情況)。 Google嚴重破碎,並且不使用RDBMS(可能會影響性能)?好的一點,對於OP來說,InnoDB內存緩存可能是一個很好的選擇。 – virtualeyes 2011-06-01 09:33:31

相關問題