2010-10-07 94 views
3

我試圖通過電話號碼搜索任何包含一些數字序列的電話號碼。高效的數據庫搜索LIKE'%something%'

顯然將是緩慢的以下內容:

Select * from customer where phone like '%1234%' 

我需要的通配符,因爲用戶被允許在數據庫中輸入任何數據,因此它可能有國家代碼,領先1(如請注意:我已經通過刪除所有非數字字符來創建'已清除'的電話號碼,所以我不需要擔心破折號,空格等。

Isother是否有魔法讓這樣的搜索在合理的時間內運行?

+2

您正在使用哪個數據庫(SQL Server,mysql,Oracle ...)? – adrianbanks 2010-10-07 23:17:01

+0

我應該提到我的MS SQL服務2008 – 2010-10-08 14:06:32

回答

2

如果你使用MySQL,你要尋找的全文搜索功能http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

它專門優化查詢,如您列出的一個,並且是相當不錯的速度快,一旦成立。你需要MySQL中的數據,並且它必須在MyISAM表中(而不是InnoDB或其他)。

我在生產中使用它,它工作得很好。

+0

全文搜索絕對是一種方式。 – James 2010-10-07 23:24:00

+0

全文搜索是否在單個單詞內工作? – 2010-10-08 00:11:05

+0

以有限的方式...有點警告。請參閱此處的*運算符http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html。基本上,您可以使用通配符,但只能在搜索詞的結尾,而不能在前面。如果空間全部取出,我可以看到這是OP搜索問題的障礙 – Joshua 2010-10-08 01:28:46

1

沒有。

如果你願意,你可以創建一個索引表。這會有點貴,但也許是值得的。

所以,你可以把電話號碼:2125551212在基於獨特的子數不勝數的引用,並建立從倒排索引:

1 
2 
5 
12 
21 
25 
51 
55 
121 
125 
212 
255 
512 
551 
555 
1255 
2125 
2555 
5121 
5512 
5551 
12555 
21255 
25551 
55121 
55512 
125551 
212555 
255512 
555121 
1255512 
2125551 
2555121 
12555121 
21255512 
212555121 
2125551212 

因此,舉例來說:

create table myindex (
    key varchar(10) not null, 
    datarowid integer not null references datarows(id) 
); 
create index i1myindex(key); 
insert into myindex values('1255', datarow.id); 

根據你想去多深。

例如,你可以只走4深,然後用4個數字掃描那些結果。因此,例如,如果您有「%123456%」,則可以詢問帶有「1234」的鍵,然後在結果集上應用完整表達式。

像:

select d.* from datarows d, myindex i where i.datarowid = d.id and i.key = '1234' and d.phone like "%123456%"; 

指數應該可以幫助你很快縮小了很多,數據庫將掃描的餘數。

很明顯,你會在這裏產生一些數據,但如果你查詢了很多,你可以在這裏做一些表現。