2008-09-11 77 views
39

我们有疑问的一大堆是“搜索”,为客户,客户等可以通过名字,电子邮件等,我们要使用如以下方式声明搜索:什么时候应该使用全文索引?

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

不该方案中的全文索引帮助?我们正在使用SQL Server 2005.

回答

26

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

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

3

具体回答这个问题的MSSQL,全文索引NOT帮助你的场景。

为了提高该查询,你可以做以下之一:

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

    哪里像“前缀%” FNAME

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

20

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

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

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

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

要确定FTS是否会生效,请确定您拥有的数据量。我在一个数亿行的数据库上使用FTS,这对于使用LIKE进行搜索是一个很大的好处,但我并不是在每张表上都使用它。

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

+1

为了澄清,FTS都于事无补而无需更改现有的查询。 – Brannon 2008-09-12 05:55:43

6

根据我的测试场景:

  • SQL Server 2008中
  • 10.000.000每一行与像一个字符串 “wordA wordB wordC ......”(变化1到30之间的话)
  • 与选择COUNT(*)包含(列, “wordB”)
  • 结果大小数十万
  • 目录大小约为1.8GB

全文索引在2s范围内,而如'%wordB%'在1-2分钟范围内。

但这个只计算,如果你不使用任何额外的选择标准!例如如果我使用了一些“像‘前缀%’”在主键列此外,表现得更糟,因为要去到全文索引的操作成本比在某些领域做一个字符串搜索更多(只要这些都是不要太多)。

因此,我建议全文索引只有在你需要做的“自由字符串搜索”,或使用一些它的特殊功能的情况下 ...

相关问题