@artmirarmi

Как вам такой MySQL запрос?

Как вам такой MySQL запрос? Не будет ли она сильно нагружать БД? Как его можно оптимизировать?

SELECT D.id,sender_id,recipient_id,send_notifications, S.id AS sender_id, R.id AS recipient_id, R.name AS recipient_name, R.birthday AS recipient_birthday, R.status AS recipient_status, R.sex AS recipient_sex, R.last_activity_at AS recipient_last_activity_at, BS.id AS im_blakcklist, BR.id AS youare_blakcklist, LM.id AS last_message
FROM dialogs D
    JOIN users S on S.id=IF(93=sender_id, sender_id, recipient_id)
    JOIN users R on R.id=IF(93=recipient_id, sender_id, recipient_id)
    LEFT JOIN blacklist BS on BS.uid=S.id and BS.who=R.id
    LEFT JOIN blacklist BR on BR.uid=R.id and BR.who=S.id
WHERE ((sender_id=93 and recipient_id!=93) or (sender_id!=93 and recipient_id=93))
ORDER BY id DESC LIMIT 0,16
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Multigame
я бы перенес
JOIN users S on S.id=IF(93=sender_id, sender_id, recipient_id)
JOIN users R on R.id=IF(93=recipient_id, sender_id, recipient_id)
Логику этих ифов из запроса в обработку...
Ответ написан
Комментировать
@Vitsliputsli
JOIN users S on S.id=IF(93=sender_id, sender_id, recipient_id)
JOIN users R on R.id=IF(93=recipient_id, sender_id, recipient_id)

По-моему первый IF всегда будет давать 93 и в нем нет смысла.

Проверьте план запроса, почему-то мне кажется, что оптимизатор будет некорректно анализировать неоднозначные условия соединения, из-за того что в разных ситуациях нужно выбирать разные индексы, он скорее всего предпочтет full scan. Но надо проверить.
Я бы все-таки соединял по однозначному условию, а уже вывод делал условным, через CASE.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы