最佳答案
一个重点是索引对某些类型的搜索根本没有帮助.例如:
SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE '%' + @SearchText + '%'
没有任何正常的索引将有助于该查询.它永远注定要慢. LIKE表达式不是sargable.
为什么?首先需要了解索引的工作原理.它们基本上将被索引的列与主键(记录指针)一起放入新表中.然后,他们在索引列而不是键上对该表进行排序.当您使用索引进行查找时,它可以非常快速地找到您想要的行,因为该索引已经过排序,以便使用二进制搜索等算法进行更有效的搜索.
现在再看一下该查询.通过在搜索文本前面放置一个通配符,您刚刚告诉数据库您不确定列的起始位置.没有多少分类会有所帮助;你仍然需要遍历整个表格,以确保找到与表达式匹配的每条记录.这意味着该列的任何正常索引对于此查询都毫无价值.
如果要在列中的任何位置搜索文本列以查找搜索字符串,则需要使用稍微不同的内容:全文索引.
现在进行对比看看这个查询:
SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'
这对于普通索引完全正常,因为您知道您希望列如何开始.它仍然可以与存储在索引中的排序值匹配,因此我们可以说它是可以搜索的.