2012-09-14 63 views
0

我已经实现了jQuery UI自动完成功能,并具有明显的性能问题。jQuery自动完成性能

最初,我让它发送一个新的查询每个字符输入(但最少3必须输入)。

我的数据库被索引,有50k行数据(5列)。我在数据库级没有任何性能问题。

我决定尝试的一种技术是缓存JSON并将自动完成指向数据库。这工作完美...高达2000行左右。除此之外,它变得缓慢和不稳定。

如果任何人有关于技术的建议,我将不胜感激。

这里有一些代码给你一个Javascript的想法。

// First, setup some data to iterate over. 
// My thought is to query the DB once, and build this list in memory to avoid autocomplete hitting the database each keystroke.   

var data = []; 
    data.push({value: "Person 1", label: "Person 1"}); 
    data.push({value: "Person 2", label: "Person 2"}); 

$("#searchBox").autocomplete({ 
    source: data; 
    minChars: 3; 
    delay: 0; 
}); 
+0

预先建议:有一些延迟时间 –

+0

究竟是什么解决? –

+0

@JasonWells用户希望在实际请求数据之前键入更多的字符,这意味着更小的结果集,更快的性能。 –

回答

2

50k行!!!!网络几乎肯定是你的瓶颈。使用TOP或LIMIT(不知道你使用的是什么数据库)当然,用户永远不会扫描50,000条结果,只是在继续输入时返回前10位。

编辑

啊我误解你的问题,该表有50K行,不是说你回50,000列卫生署! 但是,然后你提到缓存2k行,所以...只是限制结果与TOP并工作你的方式,直到它变得太慢,找到折衷,适合

+0

我正在使用SQL Server 2008.我建议将结果集缓存在内存中为了使自动完成几乎即时。为2000年以下的结果设置精美的作品:) –

+1

我仍然认为你的建议是有效的。前10〜20应该这样做。如果没有,用户将继续搜索 –

+0

我不确定我是否遵循,我们究竟在您的解决方案中缓存了什么?在我上面的评论中,我建议我们查询一次数据库,将结果集缓存在JSON中,然后将自动完成指向该JSON(更快),但它在2000年开始吠叫。关键是要避免碰到数据库全部一起。 –

0

我不使用任何数据库在服务器端,所有索引都存储在 平面文件中,并且仅发送给客户端发送“应答窗口”。

你可以用我的解决方案,看演示在这里: http://olegh.ftp.sh/autocomplete.html

这个工程非常快,一个巨大的处理字典:10M +的记录确定。

在Apache WEB服务器下工作,在Unix上使用FastCGI模块(如OS)。 我的演示适用于旧机器:Celeron-300 DeskPro和这款硬件 足以让您的工作尽可能快。

在C++,客户端上编写的服务器部分:JavaScript + Ajax。

源代码可根据要求免费提供。