Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как вам такой MySQL запрос?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
hivuld
Отправлено: 08 Февраля, 2019 - 03:38:35
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Дек. 2017  


Помог: 0 раз(а)




Как вам такой 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 текущего пользователя
 
 Top
LIME
Отправлено: 08 Февраля, 2019 - 09:17:27
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




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



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LIME пишет:
и 2 индекса Mysql не умеет

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

А в остальном согласен, для нормальной работы выгоднее продублировать строку для диалога.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 08 Февраля, 2019 - 09:57:38
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Мелкий 8 не видел пока
это хорошо
 
 Top
Мелкий Супермодератор
Отправлено: 08 Февраля, 2019 - 10:06:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Начиная с 5.5 уже существует


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB