我試圖通過電話號碼搜索任何包含一些數字序列的電話號碼。高效的數據庫搜索LIKE'%something%'
顯然將是緩慢的以下內容:
Select * from customer where phone like '%1234%'
我需要的通配符,因爲用戶被允許在數據庫中輸入任何數據,因此它可能有國家代碼,領先1(如請注意:我已經通過刪除所有非數字字符來創建'已清除'的電話號碼,所以我不需要擔心破折號,空格等。
Isother是否有魔法讓這樣的搜索在合理的時間內運行?
我試圖通過電話號碼搜索任何包含一些數字序列的電話號碼。高效的數據庫搜索LIKE'%something%'
顯然將是緩慢的以下內容:
Select * from customer where phone like '%1234%'
我需要的通配符,因爲用戶被允許在數據庫中輸入任何數據,因此它可能有國家代碼,領先1(如請注意:我已經通過刪除所有非數字字符來創建'已清除'的電話號碼,所以我不需要擔心破折號,空格等。
Isother是否有魔法讓這樣的搜索在合理的時間內運行?
如果你使用MySQL,你要尋找的全文搜索功能http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
它專門優化查詢,如您列出的一個,並且是相當不錯的速度快,一旦成立。你需要MySQL中的數據,並且它必須在MyISAM表中(而不是InnoDB或其他)。
我在生產中使用它,它工作得很好。
沒有。
如果你願意,你可以創建一個索引表。這會有點貴,但也許是值得的。
所以,你可以把電話號碼: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%";
指數應該可以幫助你很快縮小了很多,數據庫將掃描的餘數。
很明顯,你會在這裏產生一些數據,但如果你查詢了很多,你可以在這裏做一些表現。
您正在使用哪個數據庫(SQL Server,mysql,Oracle ...)? – adrianbanks 2010-10-07 23:17:01
我應該提到我的MS SQL服務2008 – 2010-10-08 14:06:32