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

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

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

全文索引是否有帮助? 我们正在使用SQL Server 2005。

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

下面是关于何时,为什么以及如何在SQL Server中使用全文索引的一篇很好的文章: 了解SQL Server全文索引

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

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

FTS有一些比较好的数据匹配algorithm,以及一些更好的统计variables的名称。 因此,当您寻找史密斯时,FTS可以提供​​更好的匹配史密斯,史密斯,史密瑟斯等的性能。

但是,使用FTS会更复杂一些,因为您需要掌握CONTAINSFREETEXT以及search的神秘格式。 但是,如果要在FName或LName匹配的情况下执行search,则可以使用一个语句而不是OR来执行search。

要确定FTS是否有效,请确定您有多less数据。 我在一个数百万行的数据库上使用FTS,这对于使用LIKE进行search是一个很大的好处,但是我并不是在每张表上都使用它。

如果您的表大小更合理,less于几百万,则可以通过为将要search的每列创build索引来获得相似的速度,而SQL Server应执行索引扫描而不是表扫描。

根据我的testing场景:

  • SQL Server 2008
  • 10.000.000行,每个都有一个像“wordA wordB wordC …”这样的string(在1到30个字之间变化)
  • 用CONTAINS(列,“wordB”)selectcount(*)
  • 结果大小几十万
  • 目录大小约1.8GB

全文索引的范围是2秒,而'%wordB%'的范围是1到2分钟。

但是这只有在你不使用任何额外的select标准的情况下才算得上! 例如,如果我还在主键列上使用了一些“like”前缀%'“ ,则性能会变差,因为进入全文索引的操作比在某些字段中执行stringsearch花费更多(只要不是太多了)。

所以我会build议全文索引在你必须做一个“免费stringsearch”或使用它的一些特殊function的情况下…

要回答专门针对MSSQL的问题,全文索引将无助于您的scheme。

为了改善这个查询,你可以执行下列操作之一:

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

    fname就像'prefix%'

(1)可能是过度的这个,除非查询的性能是一个大问题。