gpt4 book ai didi

jQuery 自动完成 - 优化问题

转载 作者:行者123 更新时间:2023-12-03 23:00:58 25 4
gpt4 key购买 nike

很想听听您对此的想法。

我在 ASP.NET MVC 应用程序中使用 jQuery 自动完成功能从数据库中检索记录列表 - 我想知道是否有比我当前的方式更好的方法 - 如下所示:

这是 jQuery(我正在使用自动完成功能调用操作方法“GetRecordByName”)

    $('#tb_name').autocomplete({
source: 'Home/GetRecordByName',
minLength: 1, delay: 0,
select: function (event, ui) {
// do stuff
}
});

在后端,我在方法中使用 Linq to Entities 从数据库获取结果:

public JsonResult GetRecordByName(string term)
{
var data = records
.Where(dr => dr.Key.StartsWith(term))
.Select(dr => new { dr, value = dr.Key })
.Take(5);

return Json(data, JsonRequestBehavior.AllowGet);
}

目前,它的运行速度有点慢(约 1-2 秒)。基本上,数据库中有数万条记录,每次您在文本框中键入一个字符时,应用程序都会访问数据库。我可以将其设置为 2 或 3 个字符,但这不会改变速度,我也不想需要那么多字符。

我有一个关于如何优化它的想法:在页面加载时,从数据库获取所有可能的结果并将其发送到客户端(通过隐藏输入或 JavaScript 数据结构),并让自动完成功能使用该客户端数据作为来源。我确信这会快如闪电,但对我来说这似乎很奇怪 - 这样做有什么缺点吗?

还有其他方法可以实现更快的自动完成吗?

更新:好吧,显然问题出在我构建 EF 调用的方式上。 EF 对“记录”的调用最终并不是在 sql 查询中构造 WHERE 子句;它每次都会获取整个表,然后 linq 方法会处理已经枚举的大量数据 - 每次键入字母时都会发生这种情况 - 导致速度减慢。哎哟!我将 .Where 方法移动到数据存储库层,它在 where 过滤结果后进行枚举,并返回字典 - 现在似乎工作得很好。感谢你的帮助!我标记了最有帮助的答案,它帮助我调查了该问题。

就 Flickr 解决方案/将整套数据提供给客户端而言,我仍然觉得这很奇怪/矫枉过正,但我​​确信它对于某些大型数据集是有保证的。还将更多地研究 OutputCache 的其他内容。

再次感谢!

最佳答案

与任何优化一样,首先必须进行测试以找出瓶颈所在。否则你的努力将会集中在错误的领域。例如,使用 Firebug 查看实际请求花费了多长时间。在 MVC 操作中使用秒表来查看实际数据检索需要多长时间(在查询末尾调用 ToList 以确保它在方法内进行计算)。

在我们知道速度变慢的地方之前,不可能为您提供真正好的优化建议,但我想到了以下一些想法:

  • 使用 SQL Server Management Studio 分析 LINQ to Entities 生成的查询的执行路径。也许在文本列上添加某种索引会让数据库更快地返回结果?
  • Windows 中存在 DNS 问题,通常会导致非 IE 浏览器在开发环境中运行速度非常缓慢。如果这在 IE 中运行很快,但在 Firefox 中不行,您可能只需要调整您的 Hosts 文件。

On pageload, get all possible results from the DB and send it to the client (via a hidden input or a javascript data structure), and have autocomplete use that client side data as the source. I'm sure that would be lightning fast, but it seems weird to me - are there are any drawbacks to doing it that way?

是的,有缺点。您说数据库中有数以万计的可能结果:足以让您怀疑数据库需要几秒钟才能从查询中返回一些结果。通过初始页面加载将所有这些条目加载到页面中将对初始页面加载造成巨大的性能影响。它可能会使您的页面大小比需要的大几十万,这对于互联网连接速度较慢的用户来说有很大的不同。

关于jQuery 自动完成 - 优化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5980167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com