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