2013-11-27 3 views
0

На столе с более чем 10 миллионами строк, какие из этих UPDATE утверждений, скорее всего, будут более быстрыми, или это большая часть мухны?Производительность оператора MySQL UPDATE

  1. UPDATE table SET col1 = col2 WHERE col1 IS NULL;
  2. UPDATE table SET col1 = col2 WHERE col1 IS NULL AND col2 IS NOT NULL;

Ни col1, ни col2 ключи или индексироваться. На самом деле это поля datetime, если это что-то меняет.


Примечание: Я довольно уверен, что запросы достичь того же результата:

запроса 1. обновит col1 каждый раз, включая настройку его до NULL если col2 is NULL.

Запрос 2. обновит col1 только если col2 имеет значение, тем самым оставляя col1 в NULL если col2 is NULL.

Они оба изменяют данные таким же образом. Один наборыcol1 к NULL когда col2 is NULL, другой листьяcol1, как NULL когда col2 is NULL, но во всех случаях col1 был NULL, чтобы начать с.

+1

два запроса разные. Оба запроса не будут обновлять одни и те же строки. –

+0

Как @SureshKamrushi говорит, что они не то же самое, логически, но и наблюдение говорит, что первый будет быстрее, поскольку он выполняет меньше проверок, хотя разница в действительной * может быть незначительной. Вы пробовали профилировать их? –

+1

Вы также должны учитывать, сколько из 10 миллионов имеет col2 как NULL. Если у вас есть только 5, у которых col2 не является нулевым, то второй должен быть быстрее, поскольку он не должен делать почти 10 миллионов обновлений. –

ответ

0

В ответ на различные замечания & ответы об измерении, а не гадать, а также замечания относительно подсчета строк, где col2 is NULL против col2, имеющий значение какой-то, я побежал 4 испытания на тестовой таблице:

      | Query 1   | Query 2 
col2 almost all NULL  | 5 min 27.96 sec | 4 min 20.38 sec 
col2 almost all has values | 34 min 31.64 sec | 32 min 31.54 sec 

Вывод: Query 2 незначительно быстрее в обоих случаях.

0

На самом деле это зависит от разных факторов.

UPDATE table SET col1 = col2; 

Выполнение полного сканирования и модификации таблицы в любом случае.

Эти запросы

UPDATE table SET col1 = col2 WHERE col1 IS NULL; 
UPDATE table SET col1 = col2 WHERE col1 IS NULL AND col2 IS NOT NULL; 

приведет к более быстрой работы, если col1 и col2 индексируются.

Вы можете получить информацию о том, что делается в этом случае, если выполнить

EXPLAIN UPDATE table SET col1 = col2; 
EXPLAIN UPDATE table SET col1 = col2 WHERE col1 IS NULL; 
EXPLAIN UPDATE table SET col1 = col2 WHERE col1 IS NULL AND col2 IS NOT NULL; 
+0

Просто попробовал это. Оказывается, 'MySQL' не позволяет использовать' EXPLAIN' с утверждениями 'UPDATE', которых я боюсь. – Stewart

1

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

Это означает: если col2 имеет индекс с тысячами различных значений, а null - один из них, он будет быстрее, чем запрос 1. Если запрос и col2 почти всегда равны нулю, он будет медленнее.

Лучшая производительность будет достигнута, если у вас есть индекс с двумя столбцами, охватывающий оба столбца, и используйте оба столбца в той части.

0

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

Смежные вопросы