2011-12-22 167 views
0

我在我的sql server 2005數據庫中有一張表,其中包含約5000萬條記錄。 我有firstNameLastName列,我希望能夠讓用戶在這些列上搜索,而不需要花費很長時間。 爲索引這些列,有沒有辦法讓我的查詢快速工作? 另外,我想搜索類似的名字。例如,如果用戶搜索Danny,我想要返回名字Dan,Daniel的記錄。如果向用戶顯示排名,結果與他實際搜索的結果有多接近,那將會很好。 我知道這是一個凝灰岩任務,但我敢打賭我不是世界上第一個面臨這個問題的人:) :)Sql以百萬記錄搜索。可能?

感謝您的幫助。

+0

關於「排名在多少%結果」:你需要找出一些算法來計算這個百分比。 – 2011-12-22 07:20:48

+1

您可以使用[DIFFERENCE](http://msdn.microsoft.com/zh-cn/library/aa258844(v = SQL.80).aspx)來計算「以百分之多近的排名」 – 2011-12-22 07:26:32

+0

「超出索引這些列「 - 爲什麼你不想索引這些列? – 2011-12-22 09:54:50

回答

0

你試過全文索引嗎?我在一張超過100萬條記錄的表格的自由文本字段中使用了它,並發現它非常快。此外,您可以添加同義詞,以便丹,丹尼爾和丹尼所有的索引都是相同的(您可以在其中獲得等同字典的詞典是一個不同的故事)。它也允許通配符搜索。全文索引也可以進行排名,但我發現它對名稱不太有用(對文檔更好)。

+0

如果文本嚴格相同,全文索引只會給出答案。這確實很快,但不是作者想要的。 – Wis 2011-12-22 11:17:54

3

我們的數據庫有五億條記錄(甲骨文,但應該有類似的表現)。如果您有適當的索引,您可以在幾毫秒內搜索它。在你的情況下,在名字和姓氏上放置一個索引。使用二叉樹索引將表現良好,並且會隨着數據庫的大小而擴展。小心的是,LIKE子句經常打破索引的使用並大大降低了表現。我知道當通配符只在字符串的右邊時,MySQL可以繼續使用帶有LIKE子句的索引。你將不得不對SQL Server進行類似的搜索。

字符串相似性確實不簡單。看看http://en.wikipedia.org/wiki/Category:String_similarity_measures,你會看到一些可能的算法。不能說如果SQL Server執行其中一個,不知道這個數據庫。嘗試谷歌「SQL Server」+的算法的名稱,可能會找到你需要的。否則,你在Wiki上提供了各種語言的代碼(可能不是SQL,但你應該能夠使它們適用於存儲過程)。

0

使用FUll TEXT SEARCH爲此表和那些列啓用,這將爲這些列創建全文索引。