全文索引和 varchar 列上的常规索引之间到底有什么区别(以及优点/缺点)?我什么时候使用哪个索引?
我有大量的 varchar 列(地址 - 城市名称、街道名称等),我需要以最高效的方式进行搜索,并且我正在尝试找出要使用的索引类型以及原因。
谢谢!
全文索引和 varchar 列上的常规索引之间到底有什么区别(以及优点/缺点)?我什么时候使用哪个索引?
我有大量的 varchar 列(地址 - 城市名称、街道名称等),我需要以最高效的方式进行搜索,并且我正在尝试找出要使用的索引类型以及原因。
谢谢!
这取决于您要执行的搜索类型。例如,您不能在此查询中使用普通索引:
SELECT * FROM [MyTable] WHERE [MyColumn] LIKE '%' + @SearchText + '%'
这不是sargable。这是 sargable,但选择性可能不是很好:
SELECT * FROM [MyTable] WHERE [MyColumn] LIKE @SearchText + '%'
您完全不同地使用全文索引:
SELECT * FROM [MyTable] WHERE CONTAINS([MyColumn], @SearchText)
通常,在使用普通索引进行搜索时,您只能在单个字段中进行搜索,例如“查找所有以 A 开头的城市”或类似的内容。
全文索引允许您跨多个列进行搜索,例如在街道、城市、省等中一次搜索。如果您想做类似 Google 风格的搜索,这可能是一个优势 - 只需输入搜索词并找到所有在任何 varchar 列中的任何位置具有该搜索词的行。
此外,通过常规搜索,您可以做的事情相当有限 - 您可以搜索完全匹配或只是 LIKE - 仅此而已。
使用全文索引,您可以通过指定自己的词库来搜索单词形式(ran、run 等)以及类似的单词。如果这是一个问题,您可以基于多种语言进行搜索。您可以搜索具有两个或多个彼此“接近”的词条的条目。
马克
从MSDN:
与全文搜索相比,LIKE Transact-SQL 谓词仅适用于字符模式。此外,您不能使用 LIKE 谓词来查询格式化的二进制数据。此外,针对大量非结构化文本数据的 LIKE 查询比针对相同数据的等效全文查询要慢得多。
对数百万行文本数据的 LIKE 查询可能需要几分钟才能返回;而对于相同的数据,全文查询可能只需要几秒钟或更短的时间,具体取决于返回的行数。