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

Поиск:

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


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


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

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



animegirl, я про то, что можно избавиться от ссылок на поля внешнего запроса в подзапросах.
А подзапросы соответственно перенести из SELECT в FROM.


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

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


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


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

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



Ну первое я сделала, я заменила
Код

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

на
Код

SELECT `mail_messages`.`text`
    FROM `way`.`mail_messages` 
    WHERE `mail_messages`.`did`=1
        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

А поповоду второго, что-то не допоняла, это как?

Это сообщение отредактировал(а) animegirl - 13.9.2012, 07:09


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


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


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

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



Цитата(animegirl @  13.9.2012,  08:09 Найти цитируемый пост)
поповоду второго, что-то не допоняла, это как?

Ну у тебя идёт в запросе 
Код

SET `поле` = (SELECT ...)
 и я подозреваю (впрочем, не убеждён), что сервер выполняет запрос для каждой записи.

А я предлагаю конвертировать его в 
Код

SET `поле` = `подзапрос`.`значение` from `таблица`, (SELECT ...) `подзапрос`
 в этом случае подзапрос будет гарантированно выполняться один раз.


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

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


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


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

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



Вроде бы бодра, но ночь была длинной.
Примерно я понимаюо чём речь идёт. А можно рабочий пример? Ну так, чтоб у меня всё расставилось на свои места. Просто то что вы написали выглядит наводкой, синтаксис ведь так не пропустит

Добавлено через 32 секунды
не обязательно по моим таблицам, просто две таблицы с двумя полями, абстрактно, но верно. Спасибо


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


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


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

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



Цитата(animegirl @  13.9.2012,  09:48 Найти цитируемый пост)
то что вы написали выглядит наводкой

это и есть наводка

Цитата(animegirl @  13.9.2012,  09:48 Найти цитируемый пост)
синтаксис ведь так не пропустит

А это с какого перепугу?

Код

update table1 t1, (select t2.id, max(t2.val) val from table2 t2 group by t2.id) q
set t1.val = q.val
where t1.id = q.id

всяко лучше, чем
Код

update table1 t1
set t1.val = (select max(t2.val) from table2 t2 where t1.id=t2.id)

и тем более чем
Код

update table1 t1
set t1.val = (select t2.val from table2 t2 where t1.id=t2.id order by t2.val desc limit 1)



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

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


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


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

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



МАХ в innoDB сработает лучше чем order by?
первый вариант поняла
второй поняла
чем первый от второго лучше тоже поняла
вроде бы даже немного вглядевшись в свой запрос поняла как можно третий избежать

Немного поковырявшись... пришла к такому варианту:
Код

UPDATE `way`.`mail_overview`, (SELECT max(`mail_messages`.`time`) `time`,`mail_messages`.`text`
    FROM `way`.`mail_messages` 
    WHERE `mail_messages`.`did`=1
        AND ((`mail_messages`.`fid`=97 AND `mail_messages`.`fid_deleted`=2) OR (`mail_messages`.`tid`=97 AND `mail_messages`.`tid_deleted`=2))) `mail_messages`
SET `mail_overview`.`last_message`=`mail_messages`.`text`,`mail_overview`.`last_message_time`=`mail_messages`.`time`
WHERE `mail_overview`.`did`=1

везде, где есть цифры, там переменные из ПХП. Застопорилась на одном моменте. Время обновляется как надо. А вот текст берётся от другой записи


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


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


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

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



Цитата(animegirl @  13.9.2012,  10:32 Найти цитируемый пост)
Застопорилась на одном моменте. Время обновляется как надо. А вот текст берётся от другой записи 

Так и дложно быть. Это и в документации описано. Если выражение выходного набора не включено ни в выражение группировки, ни в выражение аргумента статистической функции, то для его вычисления будет взята случайная запись группы.
Именно потому и получается громоздкий подзапрос - нужно получить время, а потом по нему из другой копии запись с тем же временем и текстом именно для него. Но работать всё равно будет быстрее.


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

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


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


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

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



Ясно, тогда финальный мазок и остановлюсь на этом
Код

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


Это сообщение отредактировал(а) animegirl - 13.9.2012, 11:38


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


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


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

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



Можно сюда же скину другой запрос? Просто таблицы те же
Код

SELECT * FROM `way`.`mail_overview` WHERE `mail_overview`.`uid`=97 OR `mail_overview`.`uid2`=97 ORDER BY `mail_overview`.`last_message_time`,`mail_overview`.`last_message_time2` ASC

Смысл достать последние сообщение в диалоге. Я знаю, что написала чушь в order by, чушь правда работает, но это явно подпиленный костыль, который стоит как можно скорее выпрямить. Даже не знаю как ЭТО можно сделать в логический правильном порядке.
По простому человеческому там должно быть так:
Код

SELECT * FROM `way`.`mail_overview` WHERE `mail_overview`.`uid`=97 ORDER BY `mail_overview`.`last_message_time`
OR
`mail_overview`.`uid2`=97 ORDER BY `mail_overview`.`last_message_time2` ASC

Но как на правильном MySQL синтаксисе написать, мозг никак не может придумать.


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


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


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

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



Код

SELECT
  CASE WHEN `mail_overview`.`uid`=97 THEN `mail_overview`.`last_message_time` ELSE `mail_overview`.`last_message_time2`END
, * 
FROM `mail_overview` 
WHERE `mail_overview`.`uid`=97 OR `mail_overview`.`uid2`=97 
ORDER BY 1 ASC



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

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


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


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

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



Akina, #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM `mail_overview` WHERE `mail_overview`.`uid`=97 OR `mail_overview`.`uid2' at line 3


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



А разве в конструкции ORDER BY может быть OR   ?


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Akina
Дата 13.9.2012, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



animegirl, ну разверни звезду в список полей, или добавь опознашку таблицы.

Цитата(igorold @  13.9.2012,  15:52 Найти цитируемый пост)
А разве в конструкции ORDER BY может быть OR   ? 

А почему нет?



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

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


 




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


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

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