Как оптимизировать простой запрос на обновление в Mysql? - PullRequest
0 голосов
/ 10 мая 2019

Я пишу простой запрос на обновление, чтобы обновить почти 33 тыс. Записей, но на его выполнение уходит почти 243 секунды, что является адским временем.

вот мой запрос

UPDATE Central.stg_roll_header stg
    SET stg.is_updated = 'I'
    WHERE stg.id IN (
                        SELECT roll_header_temp.id 
                        FROM roll_header_temp
                    );

и это мой план объяснения

Редактировать план

enter image description here

Пожалуйста, скажите мне, как я могу оптимизировать мой запрос на обновление, так как данные растут день ото дня, и я пока не нашел никаких идей, кроме создания фрагментов данных обновления и их обновления

1 Ответ

4 голосов
/ 10 мая 2019

Оптимизация часто зависит от детального знания: 1. Структуры базы данных. 2. Данные в базе данных. 3. Назначение всех данных в базе данных. 4. Цель самого запроса. Просто сказать, что это «просто», не дает нам много информации.

Сказав это, подзапросы часто не очень хорошая идея, и в этом случае она не нужна. «Более простое» JOIN будет делать:

UPDATE Central.stg_roll_header AS stg
INNER JOIN roll_header_temp ON stg.id = roll_header_temp.id; 
SET stg.is_updated = 'I'

См .: ОБНОВЛЕНИЕ MySQL JOIN

Это также можно записать как:

UPDATE Central.stg_roll_header AS stg, roll_header_temp
SET stg.is_updated = 'I'
WHERE stg.id = roll_header_temp.id; 

Теперь Я не могу проверить это . Я даже не знаю значения полей, и, следовательно, это может вообще ничего не улучшить, но выглядит лучше.

Запросы часто можно улучшить, включив другие столбцы с индексом. Например, тот, который основан на времени. Простое добавление WHERE YEAR(roll_time) >= 2019 может значительно улучшить запрос. Но, как я уже сказал, у нас нет никакой информации, чтобы предложить такое улучшение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...