什么时候应该使用全文索引?

时间:2008-09-11 23:37:56

标签: sql sql-server tsql indexing full-text-search

我们有一大堆查询“搜索”客户,客户等。您可以按名字,电子邮件等进行搜索。我们以下列方式使用LIKE语句:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

全文索引是否有助于该方案?我们正在使用SQL Server 2005。

4 个答案:

答案 0 :(得分:31)

这取决于您的DBMS。我相信大多数系统都不会利用全文索引,除非你使用全文函数。 (例如mySQL中的MATCH/AGAINST或MS SQL中的FREETEXT / CONTAINS)

这是一篇关于何时,为何以及如何在SQL Server中使用全文索引的好文章:Understanding SQL Server Full-Text Indexing

答案 1 :(得分:20)

FTS 可以在这种情况下提供帮助,问题在于它是否值得。

首先,让我们看看为什么LIKE可能不是最有效的搜索。当您使用LIKE时,尤其是在比较开始时使用%进行搜索时,SQL Server需要对每一行执行表扫描逐字节检查您正在检查的列。

FTS有一些更好的匹配数据的算法,以及一些关于名称变体的更好的统计数据。因此,当你寻找史密斯时,FTS可以为匹配史密斯,史密斯,史密瑟斯等提供更好的性能。

然而,使用FTS会有点复杂,因为您需要掌握CONTAINS vs FREETEXT以及搜索的神秘格式。但是,如果要在FName或LName匹配的情况下进行搜索,则可以使用一个语句而不是OR来执行此操作。

要确定FTS是否有效,请确定您拥有的数据量。我在数亿行的数据库上使用FTS,这比使用LIKE进行搜索更有利,但我不会在每个表上使用它。

如果您的表大小更合理,少于几百万,您可以通过为要搜索的每个列创建索引来获得类似的速度,SQL Server应该执行索引扫描而不是表扫描。

答案 2 :(得分:6)

根据我的测试场景:

  • SQL Server 2008
  • 10.000.000行,每行包含一个字符串,如“wordA wordB” wordC ...“(在1到30个单词之间)
  • 使用CONTAINS(列,“wordB”)
  • 选择计数(*)
  • 结果大小数十万
  • 目录大小约1.8GB

全文索引的范围是2s,而喜欢'%wordB%'的范围是1-2分钟。

但只有在您不使用任何其他选择标准时才会重要!例如。如果我在主键列上另外使用了一些“like”前缀%'“,那么性能会更差,因为进入全文索引的操作比在某些字段中进行字符串搜索要花费更多(只要那些不是太多)。

因此,如果您需要进行“免费字符串搜索”或使用其中的一些特殊功能,我建议使用全文索引 ...

答案 3 :(得分:3)

要回答专门针对MSSQL的问题,全文索引将在您的方案中提供 NOT 帮助。

为了改进该查询,您可以执行以下操作之一:

  1. 在列上配置全文目录并使用CONTAINS()函数。
  2. 如果您主要使用前缀进行搜索(即从名称的开头进行匹配),则可以将谓词更改为以下内容并在列上创建索引。

    其中fname喜欢'prefix%'

  3. 除非查询的性能是一个大问题,否则

    (1)可能有点过分。