2012-04-27 51 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