C# 在asp.net MVc web应用程序中使用.Contains进行搜索和自动完成搜索的可伸缩性如何

C# 在asp.net MVc web应用程序中使用.Contains进行搜索和自动完成搜索的可伸缩性如何,c#,performance,asp.net-mvc-3,contains,C#,Performance,Asp.net Mvc 3,Contains,我找到了很多在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.C

我找到了很多在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();
}
public-ActionResult-ArtistSearch(字符串q)
{
var-artists=GetArtists(q);
返回PartialView(艺术家);
}
私有列表GetArtists(字符串搜索字符串)
{
返回storeDB.Artists
.Where(a=>a.Name.Contains(searchString))
.ToList();
}
但这提出了一个问题,即在可能有数千条记录的实际应用程序中,这种方法的可伸缩性有多大???,那么使用Contains()是否可以很好地伸缩,或者是否有更好的方法??
BR

子字符串查询不能使用索引查找。但他们仍然可以使用索引。如果你不经常扫描几千条记录,那就什么都不是了


因此,我建议您在
Name
上创建索引,这样就可以处理大量数据。

子字符串查询不能使用索引查找。但他们仍然可以使用索引。如果你不经常扫描几千条记录,那就什么都不是了


因此,我建议您在
Name
上创建一个索引,这样就可以处理大量数据。

如果我没记错的话
string.Contains()
被转换为一个类似的查询,查询字符串的每一侧都有一个通配符。这使得使用索引非常困难/不可能,因此您可以预期数据集的性能为O(n),因为SQL Server执行完整的表扫描(请参阅)

要优化查询,您可能需要查看全文索引功能,详细信息如下:)

如果您可以使用
.StartsWith
而不是.Contains,那么您将有一个结尾带有通配符的LIKE查询,并且您可以使用查询列上的索引来快速查找(请确保检查查询执行计划!)


我想如果你试着专注于自动完成功能的用户体验,你会有更好的感知性能:在短时间锁定后(当用户停止键入时)启动自动完成搜索,并确保它不会阻塞(发生在后台)

如果我没记错的话,
string.Contains()
被翻译成一个类似的查询,在查询字符串的每一侧都有一个通配符。这使得使用索引非常困难/不可能,因此您可以预期数据集的性能为O(n),因为SQL Server执行完整的表扫描(请参阅)

要优化查询,您可能需要查看全文索引功能,详细信息如下:)

如果您可以使用
.StartsWith
而不是.Contains,那么您将有一个结尾带有通配符的LIKE查询,并且您可以使用查询列上的索引来快速查找(请确保检查查询执行计划!)


我想如果你试着专注于自动完成功能的用户体验,你会有更好的感知性能:在短时间锁定后(当用户停止键入时)启动自动完成搜索,并确保它不会阻塞(发生在后台)

看起来您正在实体框架中使用LINQ。LINQ被转换为SQL,对contains的调用被转换为LIKE WHERE子句,因此您只需从名称为“%WHERE%”的艺术家那里运行
SELECT*
即可了解性能


请注意,您可以做一些事情来减少影响。您可以限制结果的数量。选择(20)。此外,您还可以等到用户至少接受几个字符后再触发自动完成。最后,您可以“限制”对auto complete的调用,这样您就不会在他们每次键入字符时都调用auto complete,而不是等到他们在不键入其他字符的情况下等待半秒钟。

看起来您正在将LINQ与实体框架一起使用。LINQ被转换为SQL,对contains的调用被转换为LIKE WHERE子句,因此您只需从名称为“%WHERE%”的艺术家那里运行
SELECT*
即可了解性能


请注意,您可以做一些事情来减少影响。您可以限制结果的数量。选择(20)。此外,您还可以等到用户至少接受几个字符后再触发自动完成。最后,您可以“限制”对auto complete的调用,这样您就不会在他们每次键入字符时都调用auto complete,而不是等到他们在不键入其他字符的情况下等待半秒钟。

这取决于您所提供的数据。在“真实世界”的应用程序中,您需要考虑噪音/停止词(“and”、“the”)、缩写(“st”表示“street”)等以及难学的语言


在这些情况下,
.Contains
不符合要求,您需要使用全文搜索索引引擎,如Lucene.NET或SQL Server全文搜索。

这取决于您提供的数据。在“真实世界”的应用程序中,您需要考虑噪音/停止词(“and”、“the”)、缩写(“st”表示“street”)等以及难学的语言


在这些情况下,
.Contains
不符合要求,您需要使用全文搜索索引引擎,如Lucene.NET或SQL Server全文搜索。

为什么不在大型数据集上进行测试?这取决于您的模式和数据量。对于大型数据集,我可能会命中缓存而不是DB。为什么不在大型数据集上进行测试呢?这取决于您的模式和数据量。对于大型数据集,我可能会使用缓存而不是数据库。