Задать вопрос
good_br
@good_br
учусь

Как можно оптимизировать запрос?

fd5183e34921458f9ed7b464c73940d5.pngДоброй ночи! Написал запрос по выборки из базы. Проблема в том что он получиться гигантским, как то можно сократить его? И еще после добавления фильтра по коду города,
выдает очень мало контактов, я точно знаю , что их больше должно быть, может быть что то неправильно написано?
AND phone1 AND phone2 REGEXP "495" AND "499" AND "812"

use old;
SELECT `firstname`, 
`middlname`,
 `lastname`,
 `age`,
 `phone1`,
 `phone2`,
 `town` 
FROM profil WHERE `town` BETWEEN 4 AND 14 AND `age` BETWEEN 64 AND 99 AND phone1 AND phone2 REGEXP "495" AND "499" AND "812";
  • Вопрос задан
  • 128 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
dimonchik2013
@dimonchik2013
non progredi est regredi
если все три в регекспе, то записано неправильно
REGEXP "495" AND "499" AND "812"

это тоже неправильно
AND phone1 AND phone2 REGEXP "495" AND "499" AND "812"

регексп нужно к каждому полю, т.е. phone1 regexp expression and phone2 regexp expression

в остальном лучше скобок наставить
Ответ написан
Комментировать
Rastishka
@Rastishka
Привести телефоны к единой форме записи (убрать скобочки, тире, сделать чтобы всегда начинался с +7###)
Выкинуть РЕГЕКСПЫ, потому что с ними фуллскан и без использования индекса
Добавить индексы на поля town, age, phone1, phone2

Сделать запрос:
***
WHERE `town` BETWEEN 4 AND 14
AND `age` BETWEEN 64 AND 99
AND (phone1 LIKE '+7495%' OR phone1 LIKE '+7499%' OR phone1 LIKE '+7812%')
AND (phone2 LIKE '+7495%' OR phone2 LIKE '+7499%' OR phone2 LIKE '+7812%');

Для хайлоада не покатит конечно, но минимальными силами ускоришь запрос раз в 100-1000. =)
Ответ написан
Ваш ответ на вопрос

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

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