假設有整數列id
索引,有效地在int列上執行regex搜索嗎?
我怎麼有效地找到那些記錄id
比賽%789%
?
id LIKE '%789%'
將無法使用該索引,並會有性能問題。
有效地完成這項工作有一個竅門嗎?
假設有整數列id
索引,有效地在int列上執行regex搜索嗎?
我怎麼有效地找到那些記錄id
比賽%789%
?
id LIKE '%789%'
將無法使用該索引,並會有性能問題。
有效地完成這項工作有一個竅門嗎?
您可以創建一個像convert(varchar(20),int_column)這樣的計算列,並在其上放置一個索引。每當你想對int_column使用LIKE運算符時,你都會對計算列進行操作。
對不起,在我的情況下添加另一列是不可接受的。 – 2012-04-27 01:43:14
如果你的模式真的打包在一起(而不是像%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
顯然,如果你知道你的重點範圍是有界的,你可以減少比較的數量。
這是真的優化?我認爲sql服務器仍然需要遍歷** all **記錄來完成所有的比較。 – 2012-04-27 01:41:23
OP表示他在整數列上有一個索引。做一堆整數比較整數索引應該很快。 – 2012-04-27 01:43:12
有沒有辦法進一步限制掃描的行數?正如'explain'所示,這種sql仍然會掃描所有行。 – 2012-04-27 01:44:11
我懷疑你問的是錯誤的問題。我希望有一種更簡潔更有效的方式來實現你想要做的事情。在完全基本的層次上,您可以只有一列,其中包含的所有整數都不符合您的規範。只需在連接中使用此表格,就可以更有效地去除不想要的行。 – aidan 2013-04-29 05:40:16