Ajax auto complete - как сделать это быстрее? - PullRequest
1 голос
/ 12 июля 2011

В настоящее время мы выполняем сценарий автозавершения ajax через mySQL, например:

<?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 ]

6 голосов
/ 12 июля 2011

Если вы хотите ускорить автозаполнение, вы можете сделать несколько вещей:

1) подумайте, нужен ли вам запрос к базе данных (ответ «нет», если вам никогда или редко нужно менять данные для автозаполнения, да, если данные динамические, как список ваших друзей)

2) поместите закрывающие индексы в таблицы / столбцы, по которым вы выполняете поиск

3) кэшируйте свои результаты в браузере, чтобы не делать слишком много звонков

4) НИКОГДА не выполняйте запрос select * Вы тратите много времени на поиск данных, которые, вероятно, не используете! Просто выберите нужное поле!

5) когда вы выполняете поиск по идентификатору, не используйте LIKE, как вы: use = это намного быстрее

1 голос
/ 12 июля 2011
  • Включите сжатие gzip в этом ответе ajax.Это почти обязательно, потому что это уменьшает размер ответа.
  • Добавление индексов базы данных по столбцам, которые используются в поисковом запросе.Если в запросе используется несколько параметров фильтрации (например: where a = 5 and b = 6), то создайте также составные индексы.Таким образом, запрос обычно выполняется быстрее.
  • Добавьте заголовки кэширования в ответ ajax с удобным временем истечения.Это уменьшает количество повторяющихся запросов к веб-серверу, когда пользователь снова использует те же ключевые слова для поиска.
  • Добавление серверного кэширования самых популярных и самых последних запросов.Таким образом, вы сократите количество подключений / запросов к базе данных, когда разные пользователи используют одни и те же ключевые слова для поиска.
  • Использование полностью сконструированного HTML в качестве ответа ajax вместо данных JSON.Тогда на стороне клиента используйте yourHTMLelement.innerHTML = ajaxResponseData;.Таким образом, браузеру не нужно будет анализировать JSON и создавать HTML DOM.Это означает, что представление данных будет быстрее.
1 голос
/ 12 июля 2011

Если вы используете Internet Explorer, он не знает ресурс с типом контента application/json. Причиной этого является то, что Internet Explorer не может связать application/json Mime-Type с приложением, установленным на стороне клиента.

В вашем случае вы можете установить тип контента на text/json или просто application/json Я думаю.

ОБНОВЛЕНИЕ:

Вы также можете обратиться к этому , здесь ответ предлагает использовать application/json, а не application/json;charset=UTF-8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...