我正在寻找最佳方法来搜索数百万条记录,这些记录包含保存为varchar列的序列号,该列以指定的字符串键结尾。
我使用的是EndsWith,但是如果发送了多个查询,性能会相当差。
有更好的方法吗?
修改
由于搜索键长度可变,因此我无法创建包含序列号截止值的列。但是,我已经完成了一些使用Substring和Equals vs EndsWith的测试,并且我已经将执行速度降低到了EndsWith的40%。
我仍在寻找更好的解决方案:)
答案 0 :(得分:4)
不幸的是,在大多数数据库 + 上搜索以特定模式结尾的字符串很困难,因为搜索字符串后缀不能使用索引。这会导致全表扫描,在具有数百万行的表上可能会很慢。
如果您的数据库支持反向索引,请为您的字符串键列添加一个;否则,您可以通过模拟反向索引来提高性能:
例如,如果你有这样的数据
key
-----------
01-02-3-xyz
07-12-8-abc
然后增强表将具有
key rev_key
----------- -----------
01-02-3-xyz zyx-3-20-10
07-12-8-abc cba-8-21-70
并且您对ENDS_WITH(key, '3-xyz')
的搜索会要求STARTS_WITH(rev_key, 'zyx-3')
。由于字符串索引可以通过前缀加快查找速度,因此“以”开头查找会更快。
<小时/> + 一个值得注意的例外是Oracle,它专门针对这种情况提供reverse key indexes。