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

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


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

Были идеи на счёт полного перебора всех номеров (РФ) и их частей + хранение хешей этих "запросов на поиск", но дальше идеи не развивается. Возможно ли как-то оптимизировать поиск? Кто применял у себя какие-то плюшки по этому поводу?
  • Вопрос задан
  • 276 просмотров
Пригласить эксперта
Ответы на вопрос 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 (сколько надо), цифр с конца, с соответствующими индексами,и уже на уровне приложения искать полным равенством по нужному столбцу
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы