powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
8 сообщений из 8, страница 1 из 1
Помогите оптимизировать запрос
    #38862508
furashcka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот запрос, не знаю, наверно он убьет базу при запросах в 1000 в сутки?

Код: sql
1.
SELECT u.login, uAvat.url_avatar, uAvat.avatar_bg, uStat.star, uStat.like, uStat.tariff, uStat.tariff_tape, uStat.view, uInf.name, uInf.lname, uInf.country, uInf.city, uOnl.date, COUNT(uOnl2.date) as cOnline FROM ps_users u LEFT JOIN ps_users_avatar  uAvat ON uAvat.id_user=u.id_user LEFT JOIN ps_user_stats uStat ON uStat.id_user=u.id_user LEFT JOIN ps_user_info uInf ON uInf.id_user=u.id_user LEFT JOIN ps_user_online uOnl ON uOnl.id_user=u.id_user, ps_user_online uOnl2 WHERE u.id_user IN(SELECT IF(id_user_frend=4,id_user_uf,id_user_frend) FROM ps_user_frends WHERE id_user_uf=4 OR id_user_frend=4 AND agreement=1) GROUP BY uOnl.date LIMIT 50



Я даже не знаю, разберется тут кто в таком кошмаре))

Сам запрос:

Из таблицы 'ps_frends' Вытаскиваем все ID друзей, после при помощи IN() ищем их в таблице ps_users и к таблице клеим остальную инфу с таблиц где table.id_user=ps_users.id_user, все отлично работает (не знаю оптимизирован такой запрос или структура бд неверна), в чем собственно проблема: я вытаскиваю из ps_user_online по id время последней активности, чтобы узнать кто из друзей онлайн, вытаскиваю я по 50 чел, чтобы не грузить по пол часа базу, а вот как мне посчитать всех друзей которые онлайн если друзей у меня 300 я не знаю( в голову пришло вот такое извращение - я склеиваю ps_user_online uOnl1 для выборки последней активности и еще после всех LEFT JOIN table ON id=id, я выполняю повторный запрос к ps_user_online uOnl2 count(uOnl2.date) AS cOnline для подсчета всех кто есть в таблице и вот что мне возвращает phpMyAdmin - Скриншот


в чем минусы: я получаю дополнительную колонку (см скриншот) где к каждому из пользователей добавляется колонка cOnline, это нагрузит базу!? а мне ее нужно получить в единственном экземпляры, и еще я достаю все кто есть в таблице
ps_user_online а не кто онлайн, если добавить WHERE то весь запрос вообще не отработает когда не будет там кто онлайн


Мне не нравится это решение... оно ужасное! На другое мозгов не хватило... есть какое решение?
Знаю нужно быть очень догадливым чтобы понять меня, СПАСИБО ЗАРАНИЕ!!!!
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38862510
furashcka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри не знаю как изменить сообщение, вот более читабельный запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT u.login, uAvat.url_avatar, uAvat.avatar_bg, uStat.star, uStat.like, uStat.tariff, uStat.tariff_tape, uStat.view, uInf.name, uInf.lname, uInf.country, uInf.city, uOnl.date, COUNT(uOnl2.date) as cOnline 
FROM ps_users u 
LEFT JOIN ps_users_avatar  uAvat ON uAvat.id_user=u.id_user 
LEFT JOIN ps_user_stats uStat ON uStat.id_user=u.id_user 
LEFT JOIN ps_user_info uInf ON uInf.id_user=u.id_user 
LEFT JOIN ps_user_online uOnl ON uOnl.id_user=u.id_user, ps_user_online uOnl2 
WHERE u.id_user IN(

SELECT IF(id_user_frend=4,id_user_uf,id_user_frend) FROM ps_user_frends WHERE id_user_uf=4 OR id_user_frend=4 AND agreement=1

) 
GROUP BY uOnl.date LIMIT 50
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38862516
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вчитывался, но если MySQL ниже версии 5.6, то см. 17105176
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38862527
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
furashcka,

1. Не заметил наличия смысла в левых джойнах. Они точно нужны?

2. Как вам и посоветовали - перепишите подзапрос в IN() в такой же ещё один джойн, тем более, что его условие - статично.

3. Проверьте план выполнения и добавьте индексы "по вкусу".

Всё. :)

---------------------
В поиске интересной работы.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38862603
furashcka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,
Не совсем статично, там переменная подставляется (4 поставил для проверки в phpMyAdmin от туда копи паст сюда), возможно я не знаю о существовании динамических запросах

Если переписать подзапрос IN() в левый джойн, разве отработают условия остальных join правильно ON?

Ведь запрос выбирает из таблицы ps_users где WHERE IN(Выбираем id своих друзей (Подзапрос)) а после в join где ON tableInfo.id_user=ps_users.id_user ???

Да нужно нормально выучить MySQL, не подскажите хорошие видиоуроки, ну или книжку, хотя ее скорее всего и сам найду...
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38862617
furashcka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,
Вот что мне нужно вытащить из бд Скриншот Прошу прощения за такую диаграмму))

Могли бы вы мне составить запрос?))
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38862637
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
furashcka,

Нет, помогать (в смысле делать за вас) - я точно не буду. Уж извините. Насчет учебников - не подскажу, поскольку сам изучал sql очень давно, и какие сейчас есть учебники - просто не в курсе. Тут есть товарищи, которые могут помочь по этой части.

Помочь разобраться с запросом, попробую ещё раз:

1. Левый джойн нужен только в 2-х случаях:

а) у вас поиск отсутствия записи - тогда в условиях проверок где-то будет присутствовать IS NULL... его нет.

б) вам надо получить все записи из ведущей таблицы (основной), даже те, у которых данные в подчиненной отсутствуют напрочь ... нет таких записей... согласно вашей диаграмме, это означает что запись из друзей вам надо получить даже ту, у которой нет записей в какой-то таблице справа ... вот к ней тогда и нужен левый джойн. Сомневаюсь, что может отсутствовать запись типа login в частности... а у вас ко всем таблицам стоит левый джойн.
в) подзапрос в блоке IN() легко преобразовывается в точно такой же джойн, как и для остальных таблиц.

Как? Упростите свой запрос до двух таблиц, для начала: ps_users - основной из запроса и ps_user_friends из подзапроса, и попробуйте переписать это в джойн. Потом, добавьте к результату остальные таблички...
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38862808
furashcka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,
Ух ты спасибо!))) попробую!!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]