Задать вопрос
delletenebre
@delletenebre

Поиск пользователей в БД, как эффективнее?

Доброго времени суток. Есть таблица с ~5000 пользователей, нужно оптимизировать поиск по данным записям: пользователь вводит несколько символов и из БД динамически выгружается список совпадений. Наиболее близкий пример — Диалоги Хабра, поле «Введите имя пользователя».

Инструменты: MySQL, PHP.

В голову пришли два решения:

1) AJAX'ом отправлять по keyup (например) значение поля и делать запрос LIKE %%. Как по мне, это будет сильно напрягать MySQL;

2) Создать static переменную, в которую при первом обращении выгрузить все записи, и потом средствами PHP искать совпадения. Для PHP не сложно будет работать с таким массивом (повторюсь ~5000 записей + дополнительные поля, типа id и т.п.)?

Может подскажите как сделать лучше? Возможно, выше написал бредовые решения.

Заранее спасибо.
  • Вопрос задан
  • 4321 просмотр
Подписаться 3 Оценить Комментировать
Решения вопроса 1
EugeneOZ
@EugeneOZ
Вы можете держать содержимое php-переменной всё время, пока юзер вводит данные? То есть у Вас PHP-запрос может висеть в памяти бесконечно долго? Такое редко бывает.
Я бы закэшировал в Redis и оттуда таскал. Есть long-polling — по long-polling, нет — по key-up. При добавлении юзера — обновлять кэш.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
lightsgoout
@lightsgoout
5000 записей это не много, обычного ajax-запроса и LIKE %% должно быть достаточно.
Ответ написан
Почему бы не попробовать Sphinx?
Один раз настроил и будь там хоть 500к пользователей, sphinx довольно быстро справится с этим.
Ответ написан
Комментировать
@igoravr
Кешируем данные в виде id:name в файл на диск. При запросе подгружаем файл и делаем поиск. Ноль запросов к БД. Кеш обновляем при добавлении нового пользователя или обновлении пользователя.
Ответ написан
merlin-vrn
@merlin-vrn
Так готовые решения есть. Мы пробовали, работает на базе из как раз нескольких тысяч наименований (hardworm поправит меня, если я ошибаюсь). Использовали мы Ajax Autocomplete for jQuery.

Что касается запроса к таблице из ~5000 наименований — так то ни для какой базы не работа, при условии, что по соответствующему полю есть индекс.
Ответ написан
@zednight
А еще можно ajax + sphinx и полнотекстовый поиск и базу почти не грузит, но это уже радикальное решение :-)
Ответ написан
Комментировать
rmrevin
@rmrevin
Преждевременная оптимизация — корень всех зол. © Кнут

Обычного запроса достаточно. Если у Вас вырастет нагрузка до такого размера, что БД будет падать от селекта, то тут уже включать кеширование.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы