大型数据集的自动完成优化
Posted
技术标签:
【中文标题】大型数据集的自动完成优化【英文标题】:Autocomplete optimization for large data sets 【发布时间】:2011-06-05 09:52:14 【问题描述】:我正在从事一个大型项目,我必须为用户提供将数据输入表单的有效方法。
该表单的三个字段需要来自公共数据源(SQL 表)子集的值。我使用 JQuery 和 JQuery UI 构建了一个自动完成功能,它发布到一个通用的 HttpHandler。
在内部,处理程序使用 Linq-to-sql 从该特定表中获取所需的数据。该表有大约 10 个不同的列,linq 表达式使用 SqlMethods.Like() 来匹配这 10 个字段中每个字段的单个搜索词。
问题在于该表包含大约 20K 行。自动完成功能完美无缺,接受大量数据引入延迟,大约 6 秒左右(在我的本地机器上调试时)才会出现。
JqueryUI 自动完成有 0 延迟,在 3 键上查询,并且帖子的结果是在 Facebook 风格的多行可选选项中进行的。 (我几乎不得不重写自动完成插件......)。
所以问题在于数据与速度。关于如何加快速度的任何想法?我唯一的两个想法是缓存数据(如何/在哪里?);还是直接使用 sql 数据阅读器进行数据访问?
任何想法将不胜感激! 谢谢,
<bleepzter/>
【问题讨论】:
【参考方案1】:返回前 N 个结果肯定是个好主意。我们发现(查询 270K 的潜在列表)返回前 30 名是用户查找所需内容的更好选择,但这完全取决于您查询的数据。
此外,您真的应该将延迟降低到 100-300 毫秒等合理的值。当您将延迟设置为零时,一旦您触发了 3 个字符的触发器,每一次都有效。单身的。钥匙。中风。作为新查询发送到您的服务器。这很容易产生意想不到的、不受欢迎的效果,甚至更慢地减慢响应速度。
【讨论】:
【参考方案2】:我会考虑使用.Take(10)
linq 方法只返回前 X 行。这应该转化为 sensbile sql 调用,这将大大减少数据库的负载。随着用户键入,他们会发现越来越少的匹配项,因此他们只会看到他们需要的数据。
我通常认为 10 个项目足以让用户了解正在发生的事情并仍然快速获得他们需要的数据(请参阅 amazon.com 搜索栏以获取示例)。
显然,如果您能够以有意义的方式对数据进行排序,那么这 10 个结果将更有可能快速为用户提供他们所追求的内容。
【讨论】:
自动完成的优秀方法我看起来像这个解决方案谢谢以上是关于大型数据集的自动完成优化的主要内容,如果未能解决你的问题,请参考以下文章