53

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

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

全文索引在场景中是否有帮助?我们使用的是 SQL Server 2005。

4

4 回答 4

32

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

这是关于何时、为什么以及如何在 SQL Server 中使用全文索引的两篇好文章:

  1. 如何使用 SQL Server 全文搜索
  2. 使用全文索引解决复杂的 SQL 问题
于 2008-09-11T23:42:08.867 回答
22

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

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

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

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

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

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

于 2008-09-12T02:17:01.957 回答
6

根据我的测试场景:

  • SQL Server 2008
  • 10.000.000 行,每行都有一个字符串,如“wordA wordB wordC...”(在 1 到 30 个单词之间变化)
  • 使用 CONTAINS(column, "wordB") 选择 count(*)
  • 结果大小几十万
  • 目录大小约 1.8GB

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

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

因此,我建议仅在您必须进行“免费字符串搜索”或使用它的某些特殊功能的情况下使用全文索引...

于 2013-06-28T15:15:12.413 回答
3

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

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

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

    其中 fname 像 'prefix%'

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

于 2008-09-12T00:00:13.907 回答