Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Как вам такой MySQL запрос?

Страниц (1): [1]
 

1. hivuld - 08 Февраля, 2019 - 03:38:35 - перейти к сообщению
Как вам такой MySQL запрос? Не будет ли она сильно нагружать БД? Как его можно оптимизировать?

CODE (sql):
скопировать код в буфер обмена
  1. 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
  2. FROM dialogs D
  3.     JOIN users S ON S.id=IF(93=sender_id, sender_id, recipient_id)
  4.     JOIN users R ON R.id=IF(93=recipient_id, sender_id, recipient_id)
  5.     LEFT JOIN blacklist BS ON BS.uid=S.id AND BS.who=R.id
  6.     LEFT JOIN blacklist BR ON BR.uid=R.id AND BR.who=S.id
  7. WHERE ((sender_id=93 AND recipient_id!=93) OR (sender_id!=93 AND recipient_id=93))
  8. ORDER BY id DESC LIMIT 0,16


Там где 93, будет передаваться ID текущего пользователя
2. LIME - 08 Февраля, 2019 - 09:17:27 - перейти к сообщению
hivuld да, будет тормозить.
невозможно построить эффективный составной запрос по sender_id, recipient_id при OR
и 2 индекса Mysql не умеет
Простой вариант денормализовать дублируя сообщения добавив поле participant_id и проставляя туда обоих юзеров, каждого в свой дубль записи
да таблица будет больше зато индекс меньше и запросы проще
можно рассмотреть вертикальное разделение
то есть дублировать только записи в отдельной таблице связи
3. Мелкий - 08 Февраля, 2019 - 09:36:52 - перейти к сообщению
LIME пишет:
и 2 индекса Mysql не умеет

Не совсем так[dot]

А в остальном согласен, для нормальной работы выгоднее продублировать строку для диалога.
4. LIME - 08 Февраля, 2019 - 09:57:38 - перейти к сообщению
Мелкий 8 не видел пока
это хорошо
5. Мелкий - 08 Февраля, 2019 - 10:06:54 - перейти к сообщению
Начиная с 5.5 уже существует

 

Powered by ExBB FM 1.0 RC1