我正在寻找最佳方法来搜索数百万条记录,这些记录包含保存为以指定字符串键结尾的 varchar 列的序列号。
我使用的是 EndsWith,但是如果发送多个查询,性能会很差。
有更好的方法吗?
编辑:
由于搜索键的长度可变,因此我无法创建包含序列号截止值的列。但是,我已经使用 Substring 和 Equals 与 EndsWith 进行了一些测试,并且我已将执行速度降低到 EndsWith 的 40%。
不过,我仍在寻找更好的解决方案:)
我正在寻找最佳方法来搜索数百万条记录,这些记录包含保存为以指定字符串键结尾的 varchar 列的序列号。
我使用的是 EndsWith,但是如果发送多个查询,性能会很差。
有更好的方法吗?
编辑:
由于搜索键的长度可变,因此我无法创建包含序列号截止值的列。但是,我已经使用 Substring 和 Equals 与 EndsWith 进行了一些测试,并且我已将执行速度降低到 EndsWith 的 40%。
不过,我仍在寻找更好的解决方案:)
不幸的是,在大多数数据库+上搜索以特定模式结尾的字符串很困难,因为搜索字符串后缀不能使用索引。这会导致全表扫描,这在具有数百万行的表上可能会很慢。
如果您的数据库支持反向索引,请为您的字符串键列添加一个;否则,您可以通过模拟反向索引来提高性能:
例如,如果您有这样的数据
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')
. 由于字符串索引通过前缀加速查找,“开始于”查找会更快。