MySQL - оптимизация оператора Update - PullRequest
0 голосов
/ 12 декабря 2018
update CARS_LOOKUP
    INNER JOIN wheels_log ON CARS_LOOKUP.NoOfWheels= wheels_log.NoOfWheels
set CARS_LOOKUP.model= wheels_log.model

Я пытаюсь обновить столбец в таблице на основе объединения.Однако mysql собирается в блокировку wait_timeout.не могу изменить my.ini ИЛИ установить глобальное время ожидания.Я использую версию 5.0.80, поэтому не могу выполнить EXPLAIN

cars_lookup = 200K строк,

wheel_log = 50k строк

Что былучший способ оптимизировать вышеуказанный запрос в MYSQL.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

План A:

Если это одноразовое задание:

SET SESSION innodb_lock_wait_timeout = 1200;   -- will 20 minutes suffice?
UPDATE ...;
SET SESSION innodb_lock_wait_timeout = 50;  -- back to default

План B:

5.0 не имеет разумных значений по умолчанию для некоторых вещей.Предоставьте их для дальнейшего анализа:

SHOW VARIABLES;
SHOW GLOBAL STATUS;
how much RAM?

План C:

Пройдите через CARS_LOOKUP тысячу строк одновременно.Подробнее здесь .

План D:

Ну, вам действительно нужно подумать об этом.Трудно найти кого-то, кто бы обслуживал Ford Model-T.

Обновление 5.0 -> 5.1 -> 5.5 -> 5.6 -> 5.7 -> 8.0 - Вы на несколько версий устарели!Ну, на самом деле 5.0.80 всего 9 лет.Но это может произойти, когда EOL произошел для 5.0 (End Of Life).

0 голосов
/ 12 декабря 2018

Для этого запроса:

update CARS_LOOKUP c join
       wheels_log w
       on c.NoOfWheels = w.NoOfWheels
    set c.model= w.model;

Вам нужен индекс для wheels_log(NoOfWheels, model).

Тем не менее, я не понимаю, почему у вас будет тайм-аут для вашей версии,если ваши столы действительно большие.Одна возможность состоит в том, что wheels_log на самом деле имеет много строк с одинаковым NoOfWheels.Вы можете проверить это следующим образом:

select NoOfWheels, count(*)
from wheels_log
group by NoOfWheels
having count(*) > 1;

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

...