Является ли CASE практически полезным для нескольких обновлений в MySQL? - PullRequest
2 голосов
/ 10 марта 2012

Кажется, что единственный способ использовать UPDATE для нескольких строк - это CASE как

UPDATE posts SET rates = CASE
WHEN post_id = '44' THEN rates + 'X'
WHEN post_id = '33' THEN rates + 'Y'
WHEN post_id = '73' THEN rates + 'Z'
WHEN post_id = '63' THEN rates + 'X'
...
ELSE rates END

Рассмотрим таблицу с 1 миллионом строк.Это требует зацикливания более 1 миллиона записей для обновления, например, 10 строк.

Если мы используем одно UPDATE для каждого UPDATE как

UPDATE posts SET rates = rates + 'X' WHERE post_id='44'
UPDATE posts SET rates = rates + 'Y' WHERE post_id='33'
UPDATE posts SET rates = rates + 'Z' WHERE post_id='73'
UPDATE posts SET rates = rates + 'X' WHERE post_id='63'
...

, у нас будет 10 запросов, но мы не будемЗациклите 999 990 других строк.

Какой метод наиболее эффективен, когда число UPDATE строк значительно меньше, чем общее количество строк в таблице?

Еще один вопрос: Когда у нас есть ELSE rates END в CASE;как mysql пропускает эту запись?Тяжелая задача сопоставима с записью?

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

Вместо того, чтобы спрашивать, что наиболее эффективно, почему вы не экспериментировали с использованием доступных инструментов, таких как EXPLAIN или profiling ?Просто добавьте предложение where в ваше обновление -

UPDATE posts SET rates = CASE post_id
    WHEN 44 THEN rates + 'X'
    WHEN 33 THEN rates + 'Y'
    WHEN 73 THEN rates + 'Z'
    WHEN 63 THEN rates + 'X'
    ...
    END
WHERE post_id IN(44, 33, 73, 63...)
4 голосов
/ 10 марта 2012

почему бы вам не попробовать:

UPDATE posts SET rates = rates + 'X' WHERE post_id in (44,33...)

Мне, если вы знаете идентификаторы обновляемой линии, переходите прямо к ним.

Если количество X, Y, Z ограничено, вы можете сделать это тоже.

Обновляет ли MySQL строку, если обновленное значение такое же, как и до обновления?

3 голосов
/ 10 марта 2012

Это действительно интересный вопрос. Я провел несколько тестов, обновив 10 строк в таблице с 1 000 000 строк. Предполагая, что post_id является первичным ключом:

  • Метод 1 (CASE ... WHEN ...) занял 1,06 с
  • Метод 2 (10 запросов) занял 0,011 с
  • Метод 3 (JOIN таблица , связанный @newtover) занял 0,002 с
  • Метод 4 занял 0,002 с

Это среднее время на основе 10 выполнений каждого метода.

РЕДАКТИРОВАТЬ: И при обновлении 100 строк:

  • Метод 1: 3,232 с
  • Метод 2: 0,333 с
  • Метод 3: 0,032 с
  • Метод 4: 0,017 с

EDIT: добавлен метод 4 из @nnichols, без предложения ELSE.

...