我应该使用 LIKE 来查询有 400 万行的表吗
Posted
技术标签:
【中文标题】我应该使用 LIKE 来查询有 400 万行的表吗【英文标题】:should I use LIKE to query tables with 4 million rows 【发布时间】:2010-08-19 12:14:47 【问题描述】:我正在设计一个搜索表单,我想知道是否应该允许使用 LIKE %search_string%
搜索一个最多有 400 万行的表
【问题讨论】:
【参考方案1】:一般来说,我会说不。这是full-text indexing 的一个很好的候选者。搜索字符串中的前导 %
将消除使用任何索引的可能性。
在某些情况下等待是可以接受的和/或您不希望维护全文索引的额外管理开销,在这种情况下您可能会选择LIKE
。
【讨论】:
我实际上可以在没有前导 % 的情况下做到这一点 @Omu:如果您可以省略前导%
并在相关列上创建索引,那么您可能会发现性能是完全可以接受的。您需要使用特定的数据集和硬件进行测试才能确定。【参考方案2】:
不,你真的应该只在你的表相对较小或者你不关心你自己或其他人对你的数据库的查询的性能时才使用LIKE '%...%'
。
还有其他方法可以更好地扩展此功能,例如全文索引,或者,如果该方法不可用或不够灵活,则使用插入/更新触发器来提取非噪声词以供以后查询。
我提到了最后一种可能性,因为您可能不想要全文索引。换句话说,你真的关心像“是”、“或”和“但是”这样的词吗(这些是我之前提到的干扰词)。
您可以将字段分成单词并将相关的单词放在另一个表中,然后在 那个表上使用令人眼花缭乱的快速查询来查找实际行。
【讨论】:
你不平衡的括号困扰着我:P @tenfour,这听起来很危险,就像“我发现你缺乏信仰令人不安”,而且我呼吸困难 :-) 不用担心,已在更新中修复。 全文索引不是我了解的领域,但我认为在 SQL Server 2008 上,您可以很容易地使用自定义(可能为空)干扰词列表,而不必使用系统列表. 如果我的列是 nvarchar(20) 并且只包含一个单词,那没关系? @Omu - 这会是典型案例吗?您正在搜索一个单词中的子字符串吗?如果是这样,我实际上不知道全文索引是否会给您带来任何好处。我不确定它是否索引部分单词。如果是这种情况,您应该将此信息与有关您正在使用的 SQL Server 版本的信息一起添加到您的问题中。【参考方案3】:LIKE %search_string%
的搜索速度非常慢,即使在索引列上也是如此。最坏的情况是搜索会进行全表扫描。
如果搜索 LIKE search_string%
就足够了,我会提供这种可能性。
【讨论】:
【参考方案4】:这取决于 - 在不知道搜索的响应速度的情况下,它可能很好,也可能完全不行。只有使用可能的数据模式和搜索条件来分析您的搜索,您才会真正知道。
正如 RedFilter 指出的那样,如果普通搜索效果不佳,您可能需要考虑 Full Text Search
【讨论】:
以上是关于我应该使用 LIKE 来查询有 400 万行的表吗的主要内容,如果未能解决你的问题,请参考以下文章