注意:在这个问题中,我使用的是“自动完成”(或“迭代搜索”)一词,指的是按类型返回搜索结果,例如就像Google搜索可以给您的一样。另外,我的问题不是特定于Web应用程序还是胖客户端应用程序。

通常如何构造SQL SELECT查询以为这种类型的查询提供良好的性能,尤其是在任意大数据集上?在搜索仅基于前n个字符进行查询的情况下(最简单的情况),我是否仍在每次按键时从某个WHERE条目中发出新的SELECT结果。即使采用各种形式的缓存,这似乎也可能导致性能下降。

如果您希望您的搜索字符串返回带有前缀匹配,子字符串匹配等的结果,那么这将是一个更加困难的问题。在搜索联系人列表的情况下,您可能返回与FirstName + LastName,LastName + FirstName或任何其他子字符串匹配的结果。

最佳答案

诸如Google,Yahoo等的搜索使用全文本索引来生成关键字的高性能列表。

如果您要对单个单词列进行迭代搜索,则不需要全文本索引和关键字。您可以对索引列本身使用LIKE。

由于您是在键入时进行搜索的,因此您只在进行前缀匹配。使用LIKE子句和使用通配符进行“前缀”搜索时,索引列仍将获得正常性能。

SELECT last_name FROM users WHERE last_name LIKE 'Adam%'

如果您需要从另一端进行搜索,则需要一个反向索引,但是幸运的是,人们不会向后键入。

您将在计时器上为每个“迭代搜索”发出新的SELECT语句。仅当他们停止输入时,您才发出另一个查询。您将使用LIMIT或TOP限制结果集,以便查询在填满10条左右的记录后即可完成。同样,通过这种方式,您仅通过网络发送10条记录。
SELECT last_name FROM users WHERE last_name LIKE 'Adam%' LIMIT 10

当然,为了获得最佳性能,last_name将是主要索引。索引使数据库可以获取值,而无需触及实际记录。主索引通常是连续的,这使它们甚至更快。

如果偶然,您正在搜索一列,但返回另一列,则使用复合索引,这样数据库引擎仍然可以从索引本身获取值,而无需点击记录。
SELECT first_name FROM users WHERE last_name LIKE 'Adam%' LIMIT 10

对于上述查询,主索引将为(last_name,first_name)。

计时器是性能的关键。您可以调整计时器以获得所需的性能。

关于sql - 提供自动完成/迭代搜索结果时,如何优化数据库性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2466354/

10-15 06:33
查看更多