|
|
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Вот запрос, не знаю, наверно он убьет базу при запросах в 1000 в сутки? Код: sql 1. Я даже не знаю, разберется тут кто в таком кошмаре)) Сам запрос: Из таблицы '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 то весь запрос вообще не отработает когда не будет там кто онлайн Мне не нравится это решение... оно ужасное! На другое мозгов не хватило... есть какое решение? Знаю нужно быть очень догадливым чтобы понять меня, СПАСИБО ЗАРАНИЕ!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2015, 03:24:00 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Сорри не знаю как изменить сообщение, вот более читабельный запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2015, 03:27:49 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Не вчитывался, но если MySQL ниже версии 5.6, то см. 17105176 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2015, 04:08:07 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
furashcka, 1. Не заметил наличия смысла в левых джойнах. Они точно нужны? 2. Как вам и посоветовали - перепишите подзапрос в IN() в такой же ещё один джойн, тем более, что его условие - статично. 3. Проверьте план выполнения и добавьте индексы "по вкусу". Всё. :) --------------------- В поиске интересной работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2015, 07:04:28 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Arhat109, Не совсем статично, там переменная подставляется (4 поставил для проверки в phpMyAdmin от туда копи паст сюда), возможно я не знаю о существовании динамических запросах Если переписать подзапрос IN() в левый джойн, разве отработают условия остальных join правильно ON? Ведь запрос выбирает из таблицы ps_users где WHERE IN(Выбираем id своих друзей (Подзапрос)) а после в join где ON tableInfo.id_user=ps_users.id_user ??? Да нужно нормально выучить MySQL, не подскажите хорошие видиоуроки, ну или книжку, хотя ее скорее всего и сам найду... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2015, 14:44:44 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Arhat109, Вот что мне нужно вытащить из бд Скриншот Прошу прощения за такую диаграмму)) Могли бы вы мне составить запрос?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2015, 15:12:43 |
|
||
|
Помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
furashcka, Нет, помогать (в смысле делать за вас) - я точно не буду. Уж извините. Насчет учебников - не подскажу, поскольку сам изучал sql очень давно, и какие сейчас есть учебники - просто не в курсе. Тут есть товарищи, которые могут помочь по этой части. Помочь разобраться с запросом, попробую ещё раз: 1. Левый джойн нужен только в 2-х случаях: а) у вас поиск отсутствия записи - тогда в условиях проверок где-то будет присутствовать IS NULL... его нет. б) вам надо получить все записи из ведущей таблицы (основной), даже те, у которых данные в подчиненной отсутствуют напрочь ... нет таких записей... согласно вашей диаграмме, это означает что запись из друзей вам надо получить даже ту, у которой нет записей в какой-то таблице справа ... вот к ней тогда и нужен левый джойн. Сомневаюсь, что может отсутствовать запись типа login в частности... а у вас ко всем таблицам стоит левый джойн. в) подзапрос в блоке IN() легко преобразовывается в точно такой же джойн, как и для остальных таблиц. Как? Упростите свой запрос до двух таблиц, для начала: ps_users - основной из запроса и ps_user_friends из подзапроса, и попробуйте переписать это в джойн. Потом, добавьте к результату остальные таблички... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2015, 16:58:57 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38862510&tid=1833655]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 436ms |

| 0 / 0 |
