Более эффективно обновлять большое количество строк с разными наборами столбцов? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть 10000 строк, которые нужно обновить в таблице MySQL, и мне нужно обновить разные наборы столбцов для каждой строки (например, для некоторых строк необходимо изменить имя пользователя, для некоторых строк - изменить номер телефона, и некоторые строки нужно оба изменить). Мне нужно иметь возможность обновить эти 10000 строк менее чем за 10 минут, что представляет проблему:

В настоящее время я выполняю отдельный запрос на обновление для каждой строки (используя PDO), и обновление занимает слишком много времени 10 000 строк через 10 000 отдельных запросов. Ранее я использовал «пакетную вставку», чтобы ускорить вставку 10000 строк, но что я могу сделать, чтобы ускорить работу в отделе обновлений?

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Обновление 1 или всех столбцов в записи практически невозможно. Затраты на ведение журнала, блокировку и управление грязной страницей данных - и страница данных обычно содержит несколько записей.

Если я предполагаю, что ни одно из значений не обновляется до NULL, то вы может создать таблицу обновлений, которая имеет:

  • первичный ключ обновляемой таблицы.
  • не- NULL новые значения в столбцах, значения которых меняются.
  • NULL значения для столбцов, которые не изменяются.

Затем обновление выглядит следующим образом:

update original o join
       updates u
       on o.pk = u.pk
    set o.col1 = coalesce(u.col1, o.col1),
        o.col2 = coalesce(u.col2, o.col2),
        . . . ;

Не требуется предложение where, поскольку предположительно каждая строка в таблице updates будет хотя бы одно не NULL значение.

0 голосов
/ 06 марта 2020

10000 строк в Mysql - ничто, особенно если вы используете PK (целое число) в предложении where. Секрет быстрого обновления заключается в правильной индексации и использовании предложения WHERE. Если вам нужно обновить все строки, то вы можете просто отсканировать всю таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...