Оптимизировать запрос UPDATE JOIN в MYSQL - PullRequest
0 голосов
/ 23 апреля 2020

Я выполняю следующий SQL запрос:

UPDATE A 
  join B 
    on A.b_id  = B.id 
   SET B.col1 = 'val1'
     , B.col2 = ''
     , B.col3 = 1
 where a.col4 = 'val4' 
   and b.col5 = 1234 
   and b.col6 = 1 
   and b.col7 = 'val7';

В таблице B id - это PRIMARY KEY of B, в таблице A. b_id - это просто столбец в A, который должен иметь то же значение, что и id таблицы B.

Мой вопрос: есть ли способ оптимизировать вышеуказанный запрос с / без (предпочтительно) изменением определения таблицы? Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020
    on A.b_id  = B.id 
   SET B ...
   WHERE
   and b.col5 = 1234 
   and b.col6 = 1 
   and b.col7 = 'val7';

Я не знаю, начнется ли это с A или B. Итак, позвольте мне порекомендовать индексы для каждого:

B:  INDEX(col5, col6, col7, id)
A:  INDEX(b_id)
A:  INDEX(col4, b_id)

Они также помогут подходу подзапроса Ronn ie.

Если у вас достаточно новая версия, укажите EXPLAIN UPDATE ... как до, так и после добавления этих индексов. (Старые версии MySQL не имеют этой команды.)

0 голосов
/ 23 апреля 2020

Вы используете SUBQUERY , чтобы выполнить JOIN, чтобы уменьшить количество строк, участвующих в JOIN.

Поскольку вы обновляете только столбец таблицы B , то вы ставьте B только в UPDATE предложении. INNER JOIN было предложено предотвратить некоторые нежелательные обновления.

Улучшение показано ниже: -

 UPDATE B SET B.col1 = 'val1', B.col2 = '', B.col3 = 1 
     FROM (SELECT b_id FROM A WHERE a.col4='val4') as tableA
     INNER JOIN B ON tableA.b_id  = B.id 
     WHERE b.col5=1234 AND b.col6=1 AND b.col7='val7';
...