Уменя есть запрос, который долго работает около минут обновляет 350000строк
1) UPDATE repotrs SET flow = '5000' WHERE temp IN ( '15', '20' );
Сама выборка работает быстро 3 сек
2) SELECT flow from reports WHERE temp IN ( '15', '20' );
Я решил сделать выборку, а потом ее обновить, чтобы быстрей работал запрос, но MySQL не дает обновить ту же самую таблицу, из которой происходит чтение пишет Error Code: 1093. You can't specify target table 'reports'
3) UPDATE reports SET flow='5000' WHERE (SELECT flow from reports WHERE temp IN ( '15', '20' ));
Сделал по другому, но теперь Error Code: 1242. Subquery returns more than 1 row
4) UPDATE reports SET flow = (SELECT flow FROM (SELECT flow FROM reports WHERE temp IN ( '15', '20' )) AS temp_table);
Вопрос в чем ошибка у меня и как правильно сформировать такой запрос?
SQL
Не отрабатывает вложенный MySQL запрос
Написано же английским языком подзапрос возращает более чем одну строку.
Вы пытаетесь однуому значению присвоить 2 значения.
Если и использовать подзапрос, то он должен возвращать одну строку
Люди советуют джоин использовать и на основе этого обновлять (https://stackoverflow.com/questions/13215832/update-multiple-rows-in-a-table-based-on-result-from-subquery)
А может вам легче тупо 2 запроса сделать и не морочить себе голову.
Вы пытаетесь однуому значению присвоить 2 значения.
Если и использовать подзапрос, то он должен возвращать одну строку
Люди советуют джоин использовать и на основе этого обновлять (https://stackoverflow.com/questions/13215832/update-multiple-rows-in-a-table-based-on-result-from-subquery)
А может вам легче тупо 2 запроса сделать и не морочить себе голову.
Ошибка в том, что ты пытаешься присвоить КАЖДОЙ строке ВЕСЬ набор строк, возвращаемый подзапросом.
Самый быстрый способ обновить кучу строк - это пересоздать таблицу при помощи подходящего запроса. Во всех остальных случаях серверу надо будет тупенько перезаписать все твои изменения, и, возможно, пересчитать индексы - это займет время, никуда не денешься.
Самый быстрый способ обновить кучу строк - это пересоздать таблицу при помощи подходящего запроса. Во всех остальных случаях серверу надо будет тупенько перезаписать все твои изменения, и, возможно, пересчитать индексы - это займет время, никуда не денешься.
Old School People
а как правильно записать?
Запрос UPDATE всегда будет работать медленнее SELECT. И ничего ты с этим не сделаешь: изменить содержимое файлов базы данных многократно дольше, чем просто их прочитать. И 350 тыс. строк ты в MySQL за 3 сек. никак не поменяешь.
Раз в твоём UPDATE есть WHERE, значит внутри себя СУБД сама делает SELECT - без твоего участия. И попытки вручную воткнуть SELECT в UPDАTE скорость работы UPDATE никак не увеличат. Так что не надо пытаться руками оптимизировать то, что внутренний оптимизатор СУБД и так постарался максимально ускорить.
Хочешь, чтобы работало быстро - меняй структуру данных: чтобы запросов на изменение большого кол-ва строк НЕ ТРЕБОВАЛОСЬ.
Раз в твоём UPDATE есть WHERE, значит внутри себя СУБД сама делает SELECT - без твоего участия. И попытки вручную воткнуть SELECT в UPDАTE скорость работы UPDATE никак не увеличат. Так что не надо пытаться руками оптимизировать то, что внутренний оптимизатор СУБД и так постарался максимально ускорить.
Хочешь, чтобы работало быстро - меняй структуру данных: чтобы запросов на изменение большого кол-ва строк НЕ ТРЕБОВАЛОСЬ.
Old School People
Последнее не вкурил, менять структуру данных это как? Я тут попробовал с JOIN сделать как советовали, то комп завис и пришлось с кнопки грузить
Old School People
А если без радикальных вещей, мне сейчас нужно сделать правильный вложенный запрос
Old School People
Этот запрос дольше выполняется, чем мой, индексы на столбцы я сделал, но у меня ощущение, что они не используются
Похожие вопросы
- MySQL-запрос на обновление строки работает некорректно.
- MySQL запрос интервал в 1 день
- Выполнение вложенного запроса в БД. Скалярные запросы.
- MySQL.Задания по запросам.
- Под каким пользователем нужно работать в MySQL?
- MySQL Truncate/Delete - как это работает?
- Почему так нужен mysql?
- Друзья пожалуйста скажите любой бесплатный хостинг чтобы работал и поддерживал PHP + MySQL.
- Какие вы знаете методы оптимизации времени выполнения запроса (кроме оптимизации самого запроса)?
- Помогите написать sql запросы
2 запроса сначала выбрать, а потом обновить? а смысл не будет же обновляться только моя выборка