可伸缩性如何使用.Contains用于在asp.net MVc Web应用程序中搜索和自动完成搜索

joh*_* Gu 1 c# performance contains asp.net-mvc-3

我发现了许多在MVC Web应用程序中实现自动完成搜索的教程和书籍,如: -

public ActionResult ArtistSearch(string q)
{
var artists = GetArtists(q);
return PartialView(artists);
}
private List<Artist> GetArtists(string searchString)
{
return storeDB.Artists
.Where(a => a.Name.Contains(searchString))
.ToList();
}
Run Code Online (Sandbox Code Playgroud)

但是这引发了一个问题,即这种方法在可能有数千条记录的真实应用程序中可以扩展多少???,所以将使用Contains()规模很好或者有更好的方法?BR

Joh*_*lph 6

如果我没记错的话,会将string.Contains()其翻译成LIKE查询,并在查询字符串的每一侧都带有通配符.这使得使用索引变得非常困难/不可能,因此您可以预期数据集的性能为O(n),因为SQL Server会执行全表扫描(请参阅SQL Server优化LIKE('%%')查询?).

要优化您的查询,您可能需要查看全文索引功能,此处有更多信息:SQL Server:如何优化"喜欢"查询?).

如果您可以使用.StartsWith而不是.Contains,那么最后会有一个带通配符的LIKE查询,您可以使用查询列上的索引来快速查找(请务必检查查询执行计划!).

我想,如果你把注意力放在你的自动完成功能的UX,你将有更好的感知性能:短锁定期后开始自动完成搜索(当用户停止输入),并确保它不会阻止(发生在后台).