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

Поиск:

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


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


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

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



Akina, а как его ещё переписать? Этот вариант работает, логика задачи работает. Я так поняла, что либо движок сам экономит один селект, либо мне без него не обойтись, так как вы сами написали, что ваш вариант не рабочий. Да я могу в принципе только в одном месте подправить, а именно заменить "`mail_messages`.`did`=`mail_overview`.`did`" на "`mail_messages`.`did`=$вар", она из ПХП приходит, больших путей для изменений я тут не вижу


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


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


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

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



animegirl, давайте по шагам.

Сначала возьмём вот этот фрагмент:
Код

((`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))

Перепишите его так, чтобы логика отбора полностью сохранилась, но `mail_overview`.`uid` использовался только один раз.

Сделав это, отвлекитесь и ответьте на такой вопрос: почему в подзапросе потребовался LIMIT?


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

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


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


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

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



Потому, что во второй таблице идёт сверка по трём столбцам, и не один из них не уник, оно может повторятся, а мне нужен только последний по времени.

А никак его не переписать, на словах выглядит так:
фид - отправител
тид - получател
фид_дел - отправитель удалил
тид_дел - получатель удалил
уид - один из них, в таблице овервив есть уид и уид2, уид2 используется в другом случае, поэтому он тут не представлен.
Так что, либо фид равен уид и фид_дел не удалён, либо тид равен уид и тид_дел не удалён

Запутано, но думаю понятно или?


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


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


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

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



Цитата(animegirl @  4.9.2012,  00:58 Найти цитируемый пост)
А никак его не переписать

animegirl, я, оказывается, был невнимателен. В длинных именах не заметил, что на равенство 2 проверяются разные поля. Ок, свёртка условия отпадает.

Теперь остался последний невыясненный вопрос.

В исходном запросе в подзапросе отбираются строки в т.ч. и по условию `mail_messages`.`did`=`mail_overview`.`did`
А в запросе на обновление используется отбор по `mail_overview`.`did`=1

Это не смущает? Кстати, что это за поле - did?



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

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


Эксперт
***


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

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



Цитата
Связывание внутреннее, и условие связывания легко выносится наружу.


Условие -- конечно, выносится, чего там выносить. И приводить ничего не надо -- как есть в WHERE или ON пихаешь.

ORDER BY .. LIMIT 1 -- не выносится, оно нереляцыонно.
PM MAIL   Вверх
animegirl
Дата 4.9.2012, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Akina, мид - мэссаджИД
дид - диалогИД
В принципе, я могу в середине тоже поставить "1", вообще эта 1 она не фиксирована, там ПХП переменная
Таблицы:
Код

CREATE TABLE IF NOT EXISTS `mail_overview` (
  `did` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(10) unsigned NOT NULL,
  `uid2` int(10) unsigned NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `name2` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `last_message` varchar(31) COLLATE utf8_unicode_ci NOT NULL,
  `last_message2` varchar(31) COLLATE utf8_unicode_ci NOT NULL,
  `last_message_time` int(10) unsigned NOT NULL,
  `last_message_time2` int(10) unsigned NOT NULL,
  `readed` tinyint(1) unsigned NOT NULL COMMENT '2 - new, 1- readed',
  PRIMARY KEY (`did`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;


Код

CREATE TABLE IF NOT EXISTS `mail_messages` (
  `did` int(10) unsigned NOT NULL,
  `mid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `fid` int(10) unsigned NOT NULL,
  `tid` int(10) unsigned NOT NULL,
  `from` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `text` longtext COLLATE utf8_unicode_ci NOT NULL,
  `readed` tinyint(1) unsigned NOT NULL COMMENT '2 - new, 1- readed',
  `fid_deleted` tinyint(1) unsigned NOT NULL COMMENT '2 - show, 1 - hide',
  `tid_deleted` tinyint(1) unsigned NOT NULL COMMENT '2 - show, 1 - hide',
  `time` int(10) unsigned NOT NULL,
  UNIQUE KEY `mid` (`mid`),
  KEY `did` (`did`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=14 ;



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


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


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

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



Цитата(Akina @  4.9.2012,  12:44 Найти цитируемый пост)
В исходном запросе в подзапросе отбираются строки в т.ч. и по условию `mail_messages`.`did`=`mail_overview`.`did`
А в запросе на обновление используется отбор по `mail_overview`.`did`=1

Поскольку `mail_overview`.`did`- уникальный индекс, идентифицирующий диалог, что получается?

Вот подзапрос

Код

    (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)


Это мы выбираем все сообщения всех диалогов пользователя из таблицы сообщений, берём самое последнее его сообщение (пофиг, из какого оно диалога! отбора по did ещё нет)...
А потом мы апдейтим этим сообщением (и его временем соответственно) диалог номер 1 (did=1) этого пользователя в таблице обзоров?

Что-то я не понимаю логики происходящего...


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

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


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


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

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



Цитата(Akina @  4.9.2012,  17:21 Найти цитируемый пост)
пофиг, из какого оно диалога! отбора по did ещё нет


Как нету, а 
Код

WHERE `mail_messages`.`did`=`mail_overview`.`did`



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


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


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

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



Цитата(animegirl @  4.9.2012,  18:26 Найти цитируемый пост)
Как нету, а 

На момент выполнения подзапроса секция where внешнего запроса ещё не применялась, соответственно будут отобраны все записи всех диалогов. В т.ч. и диалогов, еоторые не соответствуют условию отбора по did внешнего подзапроса, но соответствуют остальным условиям. Внешнее же условие ограничивает обновляемые записи, но никак не отбираемые в подзапросе.

Попробуйте внешнее условие `mail_overview`.`did`=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)





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

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


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


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

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



О! Теперь поняла, спасибо, сейчас исправлю

Добавлено через 18 секунд
А как посмотреть то в итоге, сколько селектов он делает?


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


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


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

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



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


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

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


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


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

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



Хм... вопрос помечен как решённый... 


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

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


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


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

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



Akina, Всё верно, логика в запросе верная, я думала, может есть возможность по другому записать, но видимо оно и так верно. Спасибо, что подсказали поменять переменные на числа.


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


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


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

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



animegirl, просто по той логике, которую мне удалось разглядеть, я построил модель линейного запроса. Совершенно монструозного вида, но он должен работать быстрее, чем с такими подзапросами.
Но если уже не надо - то и аллах бы с им.


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

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


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


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

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



Akina, Вы про subquery или я не внимательно читала ваши ответы?


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


 




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


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

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