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

Кто-нибудь уже натыкался на затык с медленным поиском 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 (сколько надо), цифр с конца, с соответствующими индексами,и уже на уровне приложения искать полным равенством по нужному столбцу
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
26 апр. 2024, в 09:18
500 руб./в час
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект