тормозит "живой поиск" на ajax

php MySQL AJAX

Всем привет, есть база данных в ней 1 таблица в 24 000 строк типа
id | author | title | comment
Необходимо реализовать простенький живой поиск по этой базе. Для этого были сделаны 2 странички, первая – index.html из которой по средством jQuery.ajax идет обращение ко второй – search.php которая принимает переданные данные (словосочетание), обращается к базе и ищет строки где поле author или title содержит искомые значения, выводит эти строки.
Проблема, поиск очень тормозит — вводишь букву и долго ждешь пока отвиснет и покажет результат. Как по вашему можно (и нужно) оптимизировать код или логику (использовать другую БД, использовать другой механизм поиска, использовать другой механизм обработки запроса, ...) ?

Вот содержание index.html
<!DOCTYPE html>
<html>
<head>
<title>Караоке</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="jquery-1.10.2.min.js"></script>
<script>
$(function() {
$("#search").keyup(function(){
var search = $("#search").val();

$.ajax({
type: "POST",
url: "search.php",
data: {"search": search},
cache: false,
success: function(response){
$("#result").html(response);
}
});
return false;
});
});
</script>
</head>
<body>
<h1>Форма для поиска на AJAX</h1>
<div>
<form action="search.php" method="post" name="form" onsubmit="return false;">
<p><input name="search" type="text" id="search"></p>
</form>
</div>
<h2>Результат поиска</h2>
<div id="result">Вводите запрос</div>
</body>
</html>


Вот содержание search.php
<?php
$DB = array (
'type' => 'mysql',
'host' => 'localhost',
'user' => 'karaoke',
'pass' => 'karaoke',
'name' => 'karaoke',
'coding' => 'utf8'
);

try {$db = new PDO($DB['type'].":dbname=".$DB['name'].";host=".$DB['host'], $DB['user'], $DB['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ".$DB['coding'],PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC));}
catch(PDOException $e) {
echo "Ошибка подключения к БД!<br/>";
//echo $e->getMessage();
exit;
}

$search = trim($_POST['search']);
$search = htmlspecialchars($search);
//$data = $db->query("SELECT * FROM `foreign` WHERE `title` LIKE '%".$search."%' OR `author` LIKE '%".$search."%'")->fetchAll();
$data = $db->query("SELECT * FROM `foreign`")->fetchAll();
foreach ($data as $value){
echo $value['author']." | ".$value['title']."<br/>";
}
//echo json_encode($testdatadata)
?>


К мелочам, не имеющим отношение к проблеме, пожалуйста, прошу не цепляться.
Спасибо!
Ответы:
Проиндексируйте табличку
Да. И авторов - в отдельную таблицу.
Может стоит использовать лимиты? Тоесть поиск производить не с первой набранной буквы, а например при длиннее 2. И Лимит при выборке пусть выдаёт только первую 100.
да и задержки на ввод ставьте, а то я пока одно слово введу он у вас 5 запросов сделает...


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.