Как сделать быстрый поиск по ~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_name
LIKEнайт%
- задать условие, что полеlast_name
должно содержать строкунайт
.LIMIT
- ограничить количество возвращаемых записей.
- Выполнение запроса.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д