Доброго времени суток. Есть таблица с ~5000 пользователей, нужно оптимизировать поиск по данным записям: пользователь вводит несколько символов и из БД динамически выгружается список совпадений. Наиболее близкий пример — Диалоги Хабра, поле «Введите имя пользователя».
Инструменты: MySQL, PHP.
В голову пришли два решения:
1) AJAX'ом отправлять по keyup (например) значение поля и делать запрос LIKE %%. Как по мне, это будет сильно напрягать MySQL;
2) Создать static переменную, в которую при первом обращении выгрузить все записи, и потом средствами PHP искать совпадения. Для PHP не сложно будет работать с таким массивом (повторюсь ~5000 записей + дополнительные поля, типа id и т.п.)?
Может подскажите как сделать лучше? Возможно, выше написал бредовые решения.
Вы можете держать содержимое php-переменной всё время, пока юзер вводит данные? То есть у Вас PHP-запрос может висеть в памяти бесконечно долго? Такое редко бывает.
Я бы закэшировал в Redis и оттуда таскал. Есть long-polling — по long-polling, нет — по key-up. При добавлении юзера — обновлять кэш.
subvillion, Redis не заставляет использовать сразу весь его функционал и от memcached в простоте использования не отличается. В данном случае я не рискнул бы применять memcached, т.к. есть шанс упереться в лимит по размеру хранимого значения.
Можно еще не просто по key-up, а через некоторый промежуток после key-up, если ничего далее пользователь не нажимает. Например, нажал пользователь 3 буквы и ждет, вот один запрос и генерировался, а не 3. Это снизит количество лишних запросов.
+1, 5000 это очень маленький объем. База его даже не заметит.
Но если уж очень хочется не грузить базу — отдайте все 5000 и обрабатывайте в JS на стороне пользователя.
Кешируем данные в виде id:name в файл на диск. При запросе подгружаем файл и делаем поиск. Ноль запросов к БД. Кеш обновляем при добавлении нового пользователя или обновлении пользователя.
Так готовые решения есть. Мы пробовали, работает на базе из как раз нескольких тысяч наименований (hardworm поправит меня, если я ошибаюсь). Использовали мы Ajax Autocomplete for jQuery.
Что касается запроса к таблице из ~5000 наименований — так то ни для какой базы не работа, при условии, что по соответствующему полю есть индекс.