2013-03-22 4 views
0

Какая из этих операций должна выполняться быстрее в MySQL? Возьму на себя смелость у меня есть 999 значений для изменения:Несколько UPDATE или DELETE + INSERT в MySQL?

DELETE FROM table WHERE id IN(100, ..., 999); 
INSERT INTO example VALUES (100, 'Peter'), (...), (999, 'Sam'); 

ИЛИ

UPDATE table_name SET name='Peter' 
WHERE person_id=100; ...; UPDATE table_name SET name='Sam' WHERE person_id=999; 
+0

насчет [ 'REPLACE'] (http://dev.mysql.com/doc/refman/5.5/en/replace.html)? – Carsten

ответ

0

Поскольку у вас есть только 900 значений строк, чтобы изменить то первый вариант будет выполнять быстро. Потому что у вас будет только два запроса. Но если вы перейдете на второй вариант, у вас будет почти 900 запросов для запуска, которые, безусловно, будут медленными. И более эффективной идеей сделать это было бы

TRUNCATE FROM table; 
INSERT INTO example VALUES (100, 'Peter'), (...), (999, 'Sam'); 

потому что усечение работает быстрее, чем удаление.

+0

Сценарий говорит, что значения 999 меняются, поэтому в таблице могут быть тысячи или записи, но пользователь заинтересован только в замене 999 штук. –

+0

Himanshu прав, я мог бы иметь миллионы записей с идеей обновить только 999 записей. –

+0

В таком случае вам нужно перейти с опцией «два», потому что объемная вставка имеет некоторые ограничения с огромным количеством данных, так как мой предыдущий ответ был предназначен только для 999 строк. –

0

В общем случае эти две операции (DELETE/INSERT vs UPDATE) могут иметь значительно разные результаты, основанные на текущем состоянии таблицы ... Существует ли строка с id = 999? Существуют ли ограничения по внешним ключам, которые ссылаются на эту таблицу? Существуют ли триггеры, определенные в таблице?

Если спецификация предназначена для обновления строк в таблице, я бы выпустил инструкцию UPDATE, а не выдавал DELETE и INSERT.

Есть факторы, за пределами скорости, чтобы рассмотреть.

Но быстрый, вероятно, будет:

UPDATE example t 
    SET t.name 
     = CASE t.id 
      WHEN 100 THEN 'Peter' 
      WHEN ... 
      WHEN 999 THEN 'Sam' 
      ELSE t.name 
      END 
    WHERE t.id IN (100,...999) 
Смежные вопросы