Как оптимизировать поиск телефонного номера (часть строки)?

Кто-нибудь уже натыкался на затык с медленным поиском LIKE "%str%", я уверен. Сейчас в таблице около 300к записей и будет только больше. По этой таблице нужно искать строки по номеру телефона: полностью, начало, конец.
Примеры:
  • 7999541...
  • 79995415742
  • ...541...
  • ...41574


Все 4 варианта поиска актуальны и нужны. Использую MySQL 5.7.26, столбец с номером хранится в varchar(11), но уже даже сейчас запрос на выборку занимает 1.7 сек. — несколько JOIN'ов, но в целом ситуация плоха из-за LIKE "%str%".

Были идеи на счёт полного перебора всех номеров (РФ) и их частей + хранение хешей этих "запросов на поиск", но дальше идеи не развивается. Возможно ли как-то оптимизировать поиск? Кто применял у себя какие-то плюшки по этому поводу?
  • Вопрос задан
  • 271 просмотр
Пригласить эксперта
Ответы на вопрос 3
xEpozZ
@xEpozZ
Веб-разработчик
1. Индекс есть?
2. Открывайте EXPLAIN/DESCRIBE, и ищите проблему.
3. Попробуйте кинуть fultext индекс и искать через MATCH
4. Почему здесь тег PHP?
Ответ написан
@BorisKorobkov Куратор тега PHP
Web developer
Ответ написан
Комментировать
@mr-troll
Во-первых, юзай индекс. Он будет работать при полном совпадении или поиске по началу.
Во-вторых, от like %phone% можно отказаться если у тебя разные поиски. Он ищет любое вхождение. Лучше заменить отдельно на:
`phone` like "000" полное.
`phone` like "000%" по началу .
`phone` like "%000" по концу - делает фулскан, не оптимизируется индексами

Оптимизировать поиск по концу можно добавив столбцы:
1, 2, 3, 4, 5 (сколько надо), цифр с конца, с соответствующими индексами,и уже на уровне приложения искать полным равенством по нужному столбцу
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект