18

全文索引和 varchar 列上的常规索引之间到底有什么区别(以及优点/缺点)?我什么时候使用哪个索引?

我有大量的 varchar 列(地址 - 城市名称、街道名称等),我需要以最高效的方式进行搜索,并且我正在尝试找出要使用的索引类型以及原因。

谢谢!

4

3 回答 3

22

这取决于您要执行的搜索类型。例如,您不能在此查询中使用普通索引:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE '%' + @SearchText + '%'

这不是sargable。这是 sargable,但选择性可能不是很好:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE @SearchText + '%'

您完全不同地使用全文索引:

SELECT * FROM [MyTable] WHERE CONTAINS([MyColumn], @SearchText)
于 2009-07-23T17:59:23.020 回答
12

通常,在使用普通索引进行搜索时,您只能在单个字段中进行搜索,例如“查找所有以 A 开头的城市”或类似的内容。

全文索引允许您跨多个列进行搜索,例如在街道、城市、省等中一次搜索。如果您想做类似 Google 风格的搜索,这可能是一个优势 - 只需输入搜索词并找到所有在任何 varchar 列中的任何位置具有该搜索词的行。

此外,通过常规搜索,您可以做的事情相当有限 - 您可以搜索完全匹配或只是 LIKE - 仅此而已。

使用全文索引,您可以通过指定自己的词库来搜索单词形式(ran、run 等)以及类似的单词。如果这是一个问题,您可以基于多种语言进行搜索。您可以搜索具有两个或多个彼此“接近”的词条的条目。

马克

于 2009-07-23T18:06:49.430 回答
3

MSDN

与全文搜索相比,LIKE Transact-SQL 谓词仅适用于字符模式。此外,您不能使用 LIKE 谓词来查询格式化的二进制数据。此外,针对大量非结构化文本数据的 LIKE 查询比针对相同数据的等效全文查询要慢得多。

对数百万行文本数据的 LIKE 查询可能需要几分钟才能返回;而对于相同的数据,全文查询可能只需要几秒钟或更短的时间,具体取决于返回的行数。

于 2009-07-23T21:26:56.093 回答