Как сделать быстрый поиск по ~300 тыс. записям - MySQL
Формулировка задачи:
Всем привет.
Есть таблица в БД, где примерно 300 тыс. записей ФИО, но
В итоге все это очень медленно работает, т.к. поиск по всем записями осуществляется несколько раз, если не находится результат.
Если использовать в одном запросе кучу OR и % вокруг слов запроса, то в результат попадает слишком много лишнего и неотсортированного по релевантности.
Почитал про FULLTEXT INDEX в MySQL вроде он не подходит для поиска ФИО и в данном случае гораздо быстрее будет работать LIKE.
Может кто посоветует как сделать более менее релевантный поиск по такой таблице, который будет не зависеть от порядка слов вводимых пользователем?
имя и отчество, разделенные пробелом находятся в одном поле
(отчества может не быть): last_name | name -------------------- ... | ... Пушкин | Александр Сергеевич Эйнштейн | Альберт ... | ... ---------------------- Ищутся записи по запросу пользователя, причем вариациинаписания пользователем могут быть разными
: ----------------------------Имя Фамилия Отчество
илиФамилия Имя Отчество
илиФамилия
илиФамилия Имя
... ---------------------------- и тд. Чтобы реализовать более менее релевантный поиск, я сначала проверяю количество слов в запросе пользователя, если больше одного, то разбиваю их с помощью PHP на несколько слов и делаю такие запросы:$query_get = trim(strip_tags($_GET['query']));
$query_arr = explode(" ", $query_get);
$query_1 = $q_arr[0].'%';
$query_2 = $q_arr[1].'%';
$STH = DB::Connect()->prepare("
SELECT `id`, `last_name`, `name` FROM `tb_people` WHERE "
. "`last_name` LIKE :query_1 AND `name` LIKE :query_2
."LIMIT 0,$LIMIT"
);
$STH->bindParam(':query_1', $query_1);
$STH->bindParam(':query_2', $query_2);
$STH->execute();
while($row = $STH->fetch()){
$arResult[] =$row;
}
if(!$arResult){
//новый запрос только с другой комбинацией слов из запроса пользователя
}Решение задачи: «Как сделать быстрый поиск по ~300 тыс. записям»
textual
Листинг программы
SELECT `id`, `last_name`, `name` FROM `tb_people` WHERE `last_name` LIKE "найт%" LIMIT 0,100
Объяснение кода листинга программы
- Подключение к базе данных.
- Выбор таблицы для выполнения запроса.
- Формирование SQL-запроса:
SELECT- выбрать данные из таблицы.id,last_name,name- выбрать конкретные поля из таблицы.WHERE- задать условие для отбора данных.last_nameLIKEнайт%- задать условие, что полеlast_nameдолжно содержать строкунайт.LIMIT- ограничить количество возвращаемых записей.
- Выполнение запроса.