正则表达式是不是有效地搜索 int 列?

Posted

技术标签:

【中文标题】正则表达式是不是有效地搜索 int 列?【英文标题】:Do regex search on int column efficiently?正则表达式是否有效地搜索 int 列? 【发布时间】:2012-04-27 01:18:43 【问题描述】:

假设整数列id上有一个索引,

我如何有效地找到那些id 匹配%789% 的记录?

id LIKE '%789%' 将无法使用索引并且会出现性能问题。

有什么诀窍可以有效地完成这项工作吗?

【问题讨论】:

我怀疑你问错了问题。我希望有一种更简洁、更有效的方式来实现你想要做的事情。在一个完全基本的级别上,您可以拥有一个只有一列的表,其中包含所有整数而不是符合您的规范。只需在连接中使用此表即可删除您不想要的行,效率更高。 【参考方案1】:

您可以创建一个计算列,如 convert(varchar(20), int_column) 并在其上放置一个索引。每当您想对 int_column 使用 LIKE 运算符时,您可以改为对计算列执行此操作。

【讨论】:

【参考方案2】:

如果您的模式真的被打包在一起(而不是像 %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 server 仍然需要遍历 all 记录来进行所有的比较。 OP 说他在整数列上有一个索引。对整数索引进行一堆整数比较应该很快。 有没有办法进一步限制扫描的行数?正如explain 所示,这种sql 仍然会扫描所有行。 您对列中的整数值还有其他了解吗?它在一定范围内,还是总是一个奇数或任何东西? 虽然此列已编入索引,但我怀疑在比较中使用它之前修改 id 会阻止使用该索引。

以上是关于正则表达式是不是有效地搜索 int 列?的主要内容,如果未能解决你的问题,请参考以下文章

scanf中的正则表达式?

检查正则表达式是不是通过正则表达式有效

针对多个正则表达式有效地查询一个字符串

正则表达式语法

jQuery DataTable 自定义按钮正则表达式列搜索

检查字符串是不是为有效 URL 的最佳正则表达式是啥?