什么时候应该使用全文索引?
我们有一大堆的“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会更复杂一些,因为您需要掌握CONTAINS
和FREETEXT
以及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。
为了改善这个查询,你可以执行下列操作之一:
- 在列上configuration全文目录并使用CONTAINS()函数。
-
如果您主要使用前缀进行search(即从名称的起始处进行匹配),则可以将谓词更改为以下内容,并在该列上创build索引。
fname就像'prefix%'
(1)可能是过度的这个,除非查询的性能是一个大问题。