Я думаю, что вы идете по этому поводу немного (но может быть неправильно).Вы запускаете запрос на основе профилей пользователей, но все ваши критерии находятся на самом низком уровне пользователей и уровня консультантов пользователей.Я бы сделал STRAIGHT_JOIN (скажите оптимизатору, что нужно делать в том порядке, в котором ВЫ заявляете).Тогда для ваших объединений выполнение LEFT JOIN не обязательно имеет смысл, если только у вас нет пропущенных значений идентификатора ссылки между таблицами, что позволило бы некоторым записям не иметь заданный город или профиль пользователя.Итак, как я уже сказал, я бы поставил вашу таблицу пользователей на первое место, так как это, вероятно, будет иметь самый ограниченный набор результатов по критериям.Кроме того, есть индекс на (тип, активирован, забанен).Затем ваша таблица user_consultants и индекс для нее (user_id, incorporated).Города должны иметь индекс для почтовых и user_profiles, индекс для почтовых индексов.
Вот последний запрос, который я бы попробовал
select STRAIGHT_JOIN
b.user_id,
b.firstname,
b.lastname,
b.address,
b.zipcode,
b.city,
($calculatings) AS Distance
from
(select u.id, c.zsum_score
from
users u
join user_consultants c
on u.id = c.user_id
and c.incorporated = '1'
where
u.typ = '1'
and u.activated = '1'
and u.banned = '0' ) PreQuery
join user_profiles b
on PreQuery.ID = b.user_id
join cities a on b.zipcode = a.postal
where
($calculatings) <= 25
ORDER BY
Distance ASC,
PreQuery.zsum_score DESC
LIMIT 30
Поскольку соединение между пользователем и консультантами пользователей было по идентификатору пользователя, тогда консультанты пользователей и профили пользователей были по идентификатору пользователя, объединение идентификатора «PreQuery» - это то же самое, поэтому нет необходимости повторно объединяться с ОБА таблицами.