哪些数据库支持高效LIKE“%roger%”? (我怎样才能让它更快?)

时间:2011-12-16 23:39:29

标签: sql database performance

我正在寻找支持这样的索引的数据库:

select name from table where name Like "%roger%" 

我需要搜索超过十万行文本,SQL Server耗时太长。

是否有专门为此查询设计的数据库或索引? (如何更快地进行上述查询?)

4 个答案:

答案 0 :(得分:7)

任何数据库上的基于正常(b树)的索引无法按设计用于以LIKE开头的%查询,因为这会强制执行完整扫描。 Full-text indexes是此类查询的替代方案,或者将您的可搜索关键字放入不同的表格并将其编入索引(根据您的具体情况,可能是也可能不是可行的解决方案)。

答案 1 :(得分:3)

使用varchar_pattern_ops选项的PostgreSQL b-tree索引将有助于LIKE搜索,但我认为(不是100%肯定)只有左锚定。

全文索引/全文搜索(不同的数据库在名称上有不同的变体)提供了一种不同的方法,其中基于文本内容的快速查找(以及用于不同数据库的完全不同的方式)使其能够找到模式。结果也可以更灵活(在找到的单词上有一定程度的变体)。

既然你说你在使用SQLServer,那么你应该开始在http://msdn.microsoft.com/en-us/library/ms142571.aspx查看它为你提供的内容,但实际上,这也是我更喜欢PostgreSQL的地方:)

答案 2 :(得分:2)

其他几个数据库支持LIKE语法,包括MySQL。但是我不认为你会发现速度上的显着差异。

尝试将FULLTEXT索引添加到相关列(并使用FULLTEXT MATCH / AGAINST)*,或考虑其他搜索解决方案,例如Sphinx

* 请注意FULLTEXT MATCH / AGAINST快速,有一些您可能不需要的限制,例如最小字符数,有限/不支持通配符。

答案 3 :(得分:2)

可以使用

优化查询
like 'foo%'

(使用标准索引将搜索锚定在开头)。

对于您所询问的案例,最好的选择是为列创建全文索引。最流行的数据库支持这一点,但语法和实现各不相同。