【问题标题】:SQL Indexes and Multicolumn Database searchSQL 索引和多列数据库搜索
【发布时间】:2018-02-21 00:18:09
【问题描述】:

我必须实现在用户名中查找子字符串的搜索。 用户在 2 列中有 FirstName 和 LastName。做就够了WHERE FirstName LIKE '%searchText%' OR LastName LIKE '%searchText%'

我想要解决的问题是性能。假设目前我预计最多有 1000 个用户。我不想搜索需要很长时间。所以我想到了索引(那些列不会有太大变化,我希望这些列的值几乎永远不会改变)。我知道我将寻找我需要多列索引的两列。

这是正确的做法吗? 或者最好使用SQL全文搜索(请提供一些好的链接)? 创建一个将连接 FirstName 和 LastName 并在那里搜索的视图会更好吗? 或者最好只使用例如Azure 搜索(目前,这是唯一的,它可能是我需要搜索的最后一个实体)?

我正在使用托管在 Azure Web 应用程序上的 .NET 4.6 和 EntityFramework。

谢谢

【问题讨论】:

  • 当您需要前导通配符时,再多的索引也无济于事,因为您的查询将变得不可搜索。在这种情况下,全文通常更好。我投票结束这个问题过于宽泛,因为这里没有足够的细节来提供任何真正的建议。
  • 因此,如果我通过将查询更改为 FirstName% 或 LastName% 正确理解,我会得到 SARGable 查询吗?我不会说这个问题太宽泛。我要求给定搜索场景的最佳实践。我不需要任何人给我一些代码或其他东西,只需要一个方向,我应该以哪种方式解决这个搜索场景或类似的场景。无论如何,感谢您的回复,它帮助我查看了 SARGable 的东西。
  • 拥有 1000 个用户,只需扫描所有用户。如果您的表非常宽,请在 (LastName, FirstName) 上添加一个索引,以便 SQL 可以扫描它而不是整个表。

标签: sql sql-server entity-framework full-text-search azure-cognitive-search


【解决方案1】:

由于前导通配符,不会使用索引。唯一使用索引的情况是通配符位于字符串的中间或末尾。像 David Browne 所说的那样,如果您的表非常宽,在 LastName、FirstName 上添加一个索引也是一个不错的建议。

如果您确实需要同时使用两个通配符进行搜索(即部分匹配),那么我会看看您表中的数据量。如果只是我们谈论的几千行,那么表扫描在性能方面仍然非常好。如果我们谈论的是 50.000 行或更多行,那么最好使用全文索引。 这似乎是一个很好的教程:https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 2022-11-02
    • 2012-07-11
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多