我的问题是关于使用全文。我知道像以%从不使用索引开头的查询:
SELECT * from customer where name like %username%
如果我使用全文本这个查询可以采取更好的性能?对于像%username%这样的查询,sql Server可以使用全文索引的优点吗?
解决方法
简短答案
没有有效的方式在sql Server中执行中缀搜索,也不在索引列上使用LIKE或使用全文索引。
长答案
在一般情况下,没有相当于LIKE运算符的全文。虽然LIKE适用于一串字符,并且可以对目标内的任何内容执行任意通配符匹配,但设计全文只对整个字词/术语进行操作。 (这是一个简单的一点,但是为了这个答案的目的)
sql Server全文确实支持LIKE的子集与前缀术语运算符。从文档(http://msdn.microsoft.com/en-us/library/ms187787.aspx):
SELECT Name FROM Production.Product WHERE CONTAINS(Name,' "Chain*" ');
将返回产品名为“链锯”,“链式邮件”等。在功能上,这并不会让您在标准的LIKE操作符(LIKE’Chain%’)中获得任何东西,只要列被索引,使用LIKE作为前缀搜索应该可以接受性能。
LIKE运算符允许您将通配符放在任何位置,例如LIKE’%chain’,正如您所提到的那样,可以防止使用索引。但是使用全文,星号只能出现在查询字词的末尾,所以这对你没有帮助。
使用LIKE,可以通过创建一个新列来执行有效的后缀搜索,将其值设置为相反的目标列,并对其进行索引。然后可以查询如下:
SELECT Name FROM Production.Product WHERE Name_Reversed LIKE 'niahc%'; /* "chain" backwards */
它返回的产品名称以“chain”结尾。
我想你可以组合前缀和反向后缀hack:
SELECT Name FROM Production.Product WHERE Name LIKE 'chain%' AND Name_Reversed LIKE 'niahc%';
它实现了一个(潜在的)索引的中缀搜索,但它并不特别漂亮(我从来没有测试过这个,以查看查询优化器是否甚至在其计划中使用这两个索引)。