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