2012-04-27 22 views
1

假設有整數列id索引,有效地在int列上執行regex搜索嗎?

我怎麼有效地找到那些記錄id比賽%789%

id LIKE '%789%'將無法​​使用該索引,並會有性能問題。

有效地完成這項工作有一個竅門嗎?

+0

我懷疑你問的是錯誤的問題。我希望有一種更簡潔更有效的方式來實現你想要做的事情。在完全基本的層次上,您可以只有一列,其中包含的所有整數都不符合您的規範。只需在連接中使用此表格,就可以更有效地去除不想要的行。 – aidan 2013-04-29 05:40:16

回答

0

您可以創建一個像convert(varchar(20),int_column)這樣的計算列,並在其上放置一個索引。每當你想對int_column使用LIKE運算符時,你都會對計算列進行操作。

+0

對不起,在我的情況下添加另一列是不可接受的。 – 2012-04-27 01:43:14

0

如果你的模式真的打包在一起(而不是像%4%5%6%),你可以考慮將模式擴展爲相應的整數比較。它會真正爆炸你的代碼,但應該加快實際搜索的速度。

嘗試:

mod(id, 1000) = 789 or 
(7890 <= mod(id, 10000) and mod(id, 10000) < 7900) or 
(78900 <= mod(id, 100000) and mod(id, 100000) < 79000) or 
(789000 <= mod(id, 1000000) and mod(id, 1000000) < 790000) or 
... 
(789000000 <= mod(id, 1000000000) and mod(id, 1000000000) < 790000000 

顯然,如果你知道你的重點範圍是有界的,你可以減少比較的數量。

+0

這是真的優化?我認爲sql服務器仍然需要遍歷** all **記錄來完成所有的比較。 – 2012-04-27 01:41:23

+0

OP表示他在整數列上有一個索引。做一堆整數比較整數索引應該很快。 – 2012-04-27 01:43:12

+0

有沒有辦法進一步限制掃描的行數?正如'explain'所示,這種sql仍然會掃描所有行。 – 2012-04-27 01:44:11