Не существует в операторе обновления занимает больше времени - PullRequest
0 голосов
/ 27 октября 2010

В MySQL,

update table1 t1 
   set column1 = 100,
       column2 = 200
 where column3 > 500 
   and not exists(select * 
                    from table2 
                   where column1 = t1.column1);

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

для table2 ID - это основной столбец, поэтому я думаю, что яможно переписать как

update table1 t1 
   set column1 = 100,
       column2 = 200
 where column3 > 500 
   and not exists(select ID 
                   from table2  
                  where column1 = t1.column1);

, но запрос все равно выполняется 2 секунды, я хочу что-то в миллисекундах.

Ответы [ 3 ]

2 голосов
/ 27 октября 2010

Попробуйте (что не использует коррелированный подзапрос):

UPDATE Table1
   SET Column1 = 100, Column2 = 100
 WHERE Column3 > 500
   AND Column1 NOT IN (SELECT Column1 FROM Table2);
2 голосов
/ 27 октября 2010

Попробуйте вместо этого:

   UPDATE TABLE1 
LEFT JOIN TABLE2 ON TABLE2.column1 = TABLE1.column1
                AND TABLE2.column2 IS NULL 
      SET column1 = 100,
          column2 = 200
    WHERE TABLE2.column1 IS NULL
      AND column3 > 500 
0 голосов
/ 27 октября 2010

При использовании Not существует, как только обработчик запросов находит строку, он может остановиться, но если строка действительно не существует, то он должен проверить всю таблицу (для столбцов, определенных в подзапросе) перед тем, как точно знает, что строки не существует ... Поэтому единственный способ ускорить ее - если в подзапросе есть какие-либо фильтры, поместить индекс или индексы в эти столбцы. В вашем случае это будет означать индекс для Table2.column1

Использование вместо этого объединения, скорее всего, не поможет, поскольку, независимо от того, является ли это подзапросом объединения или несуществующим, обработчик запросов должен выполнить те же логические операции ввода-вывода для обработки данных.

Чтобы использовать объединение, (я не уверен в синтаксисе MySql, это может быть: P

UPDATE TABLE1 SET
     column1 = 100, 
     column2 = 200 
  From Table1 t1
      Left Join TABLE2 t2 
          ON t2.column1 = t1.column1 
  WHERE t2.column1 Is Null

или

  Update t1 Set
     column1 = 100, 
     column2 = 200 
  From Table1 t1
      Left Join Table2 t2 
          ON t2.column1 = t1.column1 
  Where t2.column1 Is Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...