delletenebre
@delletenebre

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

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

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

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

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

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

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

Заранее спасибо.
  • Вопрос задан
  • 4320 просмотров
Решения вопроса 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
Преждевременная оптимизация — корень всех зол. © Кнут

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

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

Войти через центр авторизации
Похожие вопросы