【发布时间】: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
我们有一大堆“搜索”客户、客户等的查询。您可以按名字、电子邮件等进行搜索。我们以下列方式使用 LIKE 语句:
SELECT *
FROM customer
WHERE fname LIKE '%someName%'
全文索引在场景中是否有帮助?我们使用的是 SQL Server 2005。
【问题讨论】:
标签: sql sql-server tsql indexing full-text-search
这取决于您的 DBMS。我相信除非你使用全文功能,否则大多数系统不会利用全文索引。 (例如,mySQL 中的 MATCH/AGAINST 或 MS SQL 中的 FREETEXT/CONTAINS)
这里有两篇关于何时、为什么以及如何在 SQL Server 中使用全文索引的好文章:
【讨论】:
要回答专门针对 MSSQL 的问题,全文索引不会对您的方案有所帮助。
为了改进该查询,您可以执行以下操作之一:
如果您主要使用前缀进行搜索(即从名称的开头进行匹配),您可以将谓词更改为以下内容并在列上创建索引。
其中 fname like 'prefix%'
(1) 对此可能是矫枉过正,除非查询的性能是一个大问题。
【讨论】:
FTS 可以在这种情况下提供帮助,问题是它是否值得。
首先,让我们看看为什么LIKE 可能不是最有效的搜索。当您使用LIKE 时,尤其是在比较开始时使用% 进行搜索时,SQL Server 需要对每一行执行表扫描和逐字节检查您正在检查的列。
FTS 有一些更好的算法来匹配数据,还有一些更好的名称变体统计数据。因此,当您查找 Smith 时,FTS 可以为匹配 Smith、Smythe、Smithers 等提供更好的性能。
然而,使用 FTS 有点复杂,因为您需要掌握 CONTAINS 与 FREETEXT 以及搜索的神秘格式。但是,如果您想在 FName 或 LName 匹配的地方进行搜索,您可以使用一条语句而不是 OR。
要确定 FTS 是否有效,请确定您拥有多少数据。我在数亿行的数据库上使用 FTS,这比使用 LIKE 搜索确实有好处,但我不会在每个表上都使用它。
如果您的表大小更合理,少于几百万,您可以通过为要搜索的每一列创建索引来获得类似的速度,并且 SQL Server 应该执行索引扫描而不是表扫描。
【讨论】:
根据我的测试场景:
全文索引在 2s 范围内,而 like '% wordB %' 在 1-2 分钟范围内。
但这仅在您不使用任何其他选择标准时才有效!如果我在主键列上另外使用了一些 "like 'prefix%'",性能会更差,因为进入全文索引的操作比在某些字段中进行字符串搜索的成本更高(只要这些不是太多)。
所以我建议仅在您必须进行“免费字符串搜索”或使用它的某些特殊功能的情况下使用全文索引...
【讨论】: