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