1

我正在寻找最佳方法来搜索数百万条记录,这些记录包含保存为以指定字符串键结尾的 varchar 列的序列号。

我使用的是 EndsWith,但是如果发送多个查询,性能会很差。

有更好的方法吗?

编辑:

由于搜索键的长度可变,因此我无法创建包含序列号截止值的列。但是,我已经使用 Substring 和 Equals 与 EndsWith 进行了一些测试,并且我已将执行速度降低到 EndsWith 的 40%。

不过,我仍在寻找更好的解决方案:)

4

1 回答 1

4

不幸的是,在大多数数据库+上搜索以特定模式结尾的字符串很困难,因为搜索字符串后缀不能使用索引。这会导致全表扫描,这在具有数百万行的表上可能会很慢。

如果您的数据库支持反向索引,请为您的字符串键列添加一个;否则,您可以通过模拟反向索引来提高性能:

  • 添加一列用于反向存储您的字符串键
  • 如果您的 RDBMS 支持计算列,则为反向键添加一个
  • 否则,定义一个触发器,从键列填充反向列
  • 在反转列上创建索引
  • 通过传入您要查找的反向后缀,使用反向列进行搜索。

例如,如果您有这样的数据

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,它专门为此类情况提供反向键索引。

于 2013-03-25T10:07:38.060 回答