Ajax自动完成 - 如何让它更快?

时间:2011-07-12 08:29:50

标签: php jquery ajax

我们目前正在通过mySQL运行ajax auto complete脚本,如下:

<?php
$q = strtolower($_GET['term']);
if (!$q) return;
$q = noescape($q);

if (is_numeric($q)){
    $q = mysql_query("SELECT * FROM `blah` WHERE `id` LIKE '" . $q . "%' DESC LIMIT 10");
}else{
    $q = mysql_query("SELECT * FROM `blah` WHERE `name` LIKE '" . $q . "%' DESC LIMIT 10");
}

$json = array();

while ($r = mysql_fetch_array($q)){
    $json[] = array(
        "v"     => $r['v'],
        "p"     => $r['p'],
        "s"     => $r['s'],
        "l"     => $r['v'] . ', ' . $r['s'] . ' (' . $r['p'] . ')'
    );
}

echo json_encode($json);
?>

我们希望更快地进行搜索,因此无需调用数据库并减慢速度。

我正在寻找其他人自动完成,并且在进行搜索时 - 他们的ajax正在调用“search.ds?query = blah”文件 - 这是什么?我们怎样才能快速模仿这个东西?

当下载提示的.ds文件时,我们打开它,它包含的是一个与我们的搜索匹配的数组,因此它们不会存储所有数据。

谢谢

3 个答案:

答案 0 :(得分:6)

如果您希望更快地完成自动填充功能,可以执行以下操作:

1)考虑您是否需要数据库查询(如果您从未或很少需要更改自动填充的数据,则答案为否,如果数据是动态的,则表示您的朋友列表是

2)在您正在进行搜索的表/列上放置覆盖索引

3)将结果缓存在浏览器中以避免拨打过多电话

4)永远不要做一个select *查询!!!你浪费了很多时间来检索你可能不使用的数据!只需选择你需要的字段!

5)当你对id进行查找时,不要像你那样使用LIKE:use =它的速度要快得多

答案 1 :(得分:1)

如果您使用的是Internet Explorer,则它不知道内容类型为application/json的资源。 这背后的原因是Internet Explorer无法将application/json Mime-Type与客户端上安装的应用程序相关联。

根据您的情况,您可以将内容类型设置为text/json,或者仅设置为application/json

更新:

您还可以参考this,此处答案建议使用application/json而不是application/json;charset=UTF-8

答案 2 :(得分:1)

  • 在此ajax响应中启用gzip压缩。这几乎是必须的,因为它减少了响应大小。
  • 在搜索查询中使用的列上添加数据库索引。如果查询使用多个过滤参数(例如:where a = 5 and b = 6),那么也要创建复合索引。这样查询通常运行得更快。
  • 使用方便的到期时间在ajax响应中添加缓存标头。当用户再次使用相同的搜索关键字时,这会减少对Web服务器的重复请求。
  • 添加最常见和最新请求的服务器端缓存。这样,当不同用户使用相同的搜索关键字时,您将减少数据库连接/查询的数量。
  • 使用完全构造的HTML作为ajax响应而不是JSON数据。然后在客户端使用yourHTMLelement.innerHTML = ajaxResponseData;。这样浏览器就不需要解析JSON并构造HTML DOM。这意味着数据表示将更快。