Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите оптимизировать запрос 
V
    Опции темы
animegirl
Дата 1.9.2012, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Код

UPDATE `way`.`mail_overview`
SET `mail_overview`.`last_message`=
    (SELECT `mail_messages`.`text`
    FROM `way`.`mail_messages` 
    WHERE `mail_messages`.`did`=`mail_overview`.`did`
        AND ((`mail_messages`.`fid`=`mail_overview`.`uid` AND `mail_messages`.`fid_deleted`=2) OR (`mail_messages`.`tid`=`mail_overview`.`uid` AND `mail_messages`.`tid_deleted`=2))
    ORDER BY `mail_messages`.`time` DESC
    LIMIT 1),
`mail_overview`.`last_message_time`=
    (SELECT `mail_messages`.`time`
    FROM `way`.`mail_messages` 
    WHERE `mail_messages`.`did`=`mail_overview`.`did`
        AND ((`mail_messages`.`fid`=`mail_overview`.`uid` AND `mail_messages`.`fid_deleted`=2) OR (`mail_messages`.`tid`=`mail_overview`.`uid` AND `mail_messages`.`tid_deleted`=2))
    ORDER BY `mail_messages`.`time` DESC
    LIMIT 1)
WHERE `mail_overview`.`did`=1

Есть какой-нибудь ход, не делать два селекта одной и той же строки?


--------------------
Скажи миру - НЯ!
PM   Вверх
tzirechnoy
Дата 1.9.2012, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Вряд ли. LIMIT 1, да и ORDER на самом деле -- это очень нереляцыонный конструкт.

Хотя, возможно, сработает что-то вроде

Код

INSERT INTO way.mail_overview (id, last_message, last_message_time)
   SELECT mo.id, mm.text, mm.time 
      FROM way.mail_overview mo 
           LEFT JOIN way.mail_messages mm ON mo.did=mm.did 
                     AND ( (mm.fid=mo.uid AND mm.fid_deleted=2)
                           OR
                           (mm.tid=mo.uid AND mm.tid_deleted=2) )
      WHERE mo.did=1
      ORDER BY mm.time
 ON DUPLICATE KEY UPDATE last_message=VALUES(last_message), last_message_time=VALUES(last_message_time)


Но, на самом деле, это бабушка на двое сказала, что при многих вариантах совпадения выборки из mail_messages будет установлено именно последнее значение. В общем, лучшэ не рисковать.
(Да, mail_overview.id -- имеется в виду PRIMRAY KEY. Вместо него можно подставить любой другой UNIQUE, в т.ч. составной)

А Вы уверены, что оптимизатор не преобразовал этот запрос к одному? А то, можэт, и оптимизировать здесь не требуется?
  
PM MAIL   Вверх
animegirl
Дата 1.9.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Цитата(tzirechnoy @  1.9.2012,  17:56 Найти цитируемый пост)
А Вы уверены, что оптимизатор не преобразовал этот запрос к одному? А то, можэт, и оптимизировать здесь не требуется?

А есть возможность это увидит?


--------------------
Скажи миру - НЯ!
PM   Вверх
Akina
Дата 2.9.2012, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Код

UPDATE
  `way`.`mail_overview`
, ( SELECT
      `mail_messages`.`text`
    , `mail_messages`.`time`
    FROM 
      `way`.`mail_messages` 
    WHERE
      `mail_messages`.`did`=`mail_overview`.`did`
      AND ((`mail_messages`.`fid`=`mail_overview`.`uid` AND `mail_messages`.`fid_deleted`=2) OR (`mail_messages`.`tid`=`mail_overview`.`uid` AND `mail_messages`.`tid_deleted`=2))
    ORDER BY
      `mail_messages`.`time` DESC
    LIMIT 1
  ) `subquery`
SET
  `mail_overview`.`last_message`= `subquery`.`text`
, `mail_overview`.`last_message_time`= `subquery`.`time`
WHERE
  `mail_overview`.`did`=1


PS. Структуру подзапроса не трогал.
PPS. Он кривой.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
tzirechnoy
Дата 3.9.2012, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Код UPDATE   `way`.`mail_overview` , ( SELECT


А какая версия? 5.1.63 не даёт в подзапросе в джойне ссылаться на другие таблицы из того жэ джойна. Unknown column, в данном случае будет unknown column `mail_overview`.`did` in where clause. Это, в общем, логично -- поскольку отношэния создаются/выбираются не по очереди в каком-то порядке, тем более не по очереди для каждой записи предыдущих отношэний выбирается следующее -- а все отношэния JOINа существуют до начала объединения. 
Сделать противоестественный интеллект, который бы определял, что для подзапросов в джойне нужны такие последовательные переборы -- наверное можно, но в общем нетривиально, и мне было бы любопытно, если бы он где-то появился.

Добавлено через 35 секунд
[quote]А есть возможность это увидит?[/quote

Поиграйтесь с explain.
PM MAIL   Вверх
animegirl
Дата 3.9.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



tzirechnoy, да, она самая 5.1.63


Akina, кто иммено и почему?


--------------------
Скажи миру - НЯ!
PM   Вверх
tzirechnoy
Дата 3.9.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



А, да, explain UPDATE появился только в 5.6.3. Beware, как говорится.

В остальных -- можно переписать UPDATE на равнозначный SELECT.

Добавлено через 54 секунды
Цитата
tzirechnoy, да, она самая 5.1.63


Да это я с Akina общался.
PM MAIL   Вверх
Akina
Дата 3.9.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(tzirechnoy @  3.9.2012,  11:41 Найти цитируемый пост)
 5.1.63 не даёт в подзапросе в джойне ссылаться на другие таблицы из того жэ джойна. Unknown column, в данном случае будет unknown column `mail_overview`.`did` in where clause

Не понял... ведь во внешнем запросе идёт отбор по `mail_overview`.`did`=1, во внутреннем  отсутствует группировка, следовательно, всё вырождено, подзапрос оперирует ТОЛЬКО данными таблицы mail_messages, внешний запрос - ТОЛЬКО данными таблицы mail_overview и подзапроса... Именно это в первую очередь я и имел в виду, говоря, что запрос кривой. На черезпопные условия отбора в нём можно не обращать внимания, это мелочи.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
animegirl
Дата 3.9.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



[Б]Акина[/Б], а его не надо групировать, он в overview - primary key


--------------------
Скажи миру - НЯ!
PM   Вверх
tzirechnoy
Дата 3.9.2012, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
во внутреннем  отсутствует группировка, следовательно, всё вырождено, подзапрос оперирует ТОЛЬКО данными таблицы mail_messages 


Прямщас вырождено. AND ((`mail_messages`.`fid`=`mail_overview`.`uid` ...

Впрочем, did как константу тожэ движок протаскивать не будет (хотя это можно было и руками сделать).
 



PM MAIL   Вверх
Akina
Дата 3.9.2012, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(tzirechnoy @  3.9.2012,  14:22 Найти цитируемый пост)
Прямщас вырождено

Развяжи ВЕСЬ запрос. Приведи подобные в диком условии подзапроса. Связывание внутреннее, и условие связывания легко выносится наружу.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
tzirechnoy
Дата 3.9.2012, 15:06 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



А давай ты сам этим пострадаешь? Тем более, что ты вроде знаешь, как.

И вообще, версию мыскля, на которой это или что-то такое у тебя работает -- в студию. А если ни на какой не проверял, то нечего тут трындеть попусту.
PM MAIL   Вверх
Akina
Дата 3.9.2012, 15:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Хамить совершенно необязательно. Но это к слову.

То, что написано - работать не будет, и я об этом не раз говорил. Подзапрос - кривой. Не помнишь? жаль.
На какой версии оно будет работать, если вообще когда-нибудь будет - мне по барабану. Тебе интересно? пробуй.
Если выполнить корректировку запроса, то возможно его привести к виду, когда подзапрос оперирует данными одной таблицы, а запрос - данными другой таблицы и подзапроса. Причём при полном сохранении логики. Я об этом говорил. И такой откорректированный запрос будет работать. Не знаешь как? и не надо. Задевает? мне это пофиг.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
tzirechnoy
Дата 3.9.2012, 18:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Хамить совершенно необязательно. Но это к слову.


Конечно, необязательно. Но иногда -- полезно. Способствует быстрому взаимопониманию.

Цитата
То, что написано - работать не будет, и я об этом не раз говорил.


Значит, невнятно говорил.

Цитата
Подзапрос - кривой. Не помнишь? жаль.


Это я, конечно, помню, но к делу это не относится.

Цитата
Не знаешь как? и не надо. Задевает? мне это пофиг.


Вот только и топикстартер тожэ не знает. Да и ты -- тожэ. Зачем в таком случае бросаться утверждениями, и кто ты такой, если на самом деле привести его нельзя -- оставляю подумать участникам в качестве разминки.

PM MAIL   Вверх
Akina
Дата 3.9.2012, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(tzirechnoy @  3.9.2012,  19:17 Найти цитируемый пост)
топикстартер тожэ не знает

Топикстартеру сказано, что надо переписать запрос. И я пока не вижу попыток ТС это сделать. Зато я прекрасно помню предыдущие темы ТС и некоторые утверждения в них - посему пока ТС не начнёт реально что-то делать, я и пальцем не шевельну.

Цитата(tzirechnoy @  3.9.2012,  19:17 Найти цитируемый пост)
Да и ты -- тожэ.

Учись отвечать только за себя. И не надо пробовать брать меня на "слабо". 



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.