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

时间:2020-03-05 18:51:56  来源:igfitidea点击:

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

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

全文索引在这种情况下有帮助吗?我们正在使用SQL Server 2005.

解决方案

回答

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

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

回答

要回答专门针对MSSQL的问题,全文索引对情况没有帮助。

为了改善该查询,我们可以执行以下操作之一:

  • 在列上配置全文目录,然后使用CONTAINS()函数。
  • 如果我们主要使用前缀搜索(即从名称开头匹配),则可以将谓词更改为以下内容,并在该列上创建索引。其中fname如'prefix%'

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

回答

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

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

FTS有一些更好的算法来匹配数据,还有一些更好的名称变化统计信息。因此,当我们寻找Smith时,FTS可以为匹配Smith,Smythe,Smithers等提供更好的性能。

但是,使用FTS有点复杂,因为我们需要掌握CONTAINSFREETEXT以及搜索的奥秘格式。但是,如果要搜索FName或者LName匹配的位置,则可以使用一个语句而不是OR进行搜索。

要确定FTS是否有效,请确定我们拥有多少数据。我在几亿行的数据库上使用FTS,这确实比使用LIKE进行搜索确实有好处,但是我并没有在每个表上使用它。

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