【问题标题】:When should you use full-text indexing?什么时候应该使用全文索引?
【发布时间】:2010-09-08 15:29:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql sql-server tsql indexing full-text-search


    【解决方案1】:

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

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

    1. How To Use SQL Server Full-Text Searching
    2. Solving Complex SQL Problems with Full-Text Indexing

    【讨论】:

      【解决方案2】:

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

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

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

        其中 fname like 'prefix%'

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        【讨论】:

        • 澄清一下,如果不更改现有查询,FTS 将无济于事。
        • 如果不更改现有查询,FTS 将无济于事。但是,如果您的数据集足够小,您可以在一段时间内毫无问题地使用 LIKE。
        【解决方案4】:

        根据我的测试场景:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-03-19
          • 2010-12-21
          • 2011-02-22
          • 2011-03-23
          • 1970-01-01
          • 2011-01-16
          • 2023-04-02
          相关资源
          最近更新 更多