Есть ли разумный способ массового ОБНОВЛЕНИЯ в MySQL?

#mysql

#mysql

Вопрос:

У меня есть таблица, которая нуждается в регулярном обновлении. Эти обновления происходят пакетно. В отличие от INSERT, я не могу просто включить несколько строк в один запрос. Что я делаю сейчас, так это готовлю инструкцию UPDATE, затем перебираю все возможности и выполняю каждую. Конечно, подготовка происходит только один раз, но исполнений все еще много.

Я создал несколько версий таблицы разных размеров (думая, что, возможно, поможет лучшая индексация или разделение таблицы). Однако это не повлияло на время обновления. 100 обновлений занимают около 4 секунд либо для таблицы из 1000 строк, либо для таблицы из 500 000 строк.

Есть ли более разумный способ сделать это быстрее?

Как и спрашивалось в комментариях, вот фактический код (PHP) Я тестировал с. Столбец ‘id’ является первичным ключом.

 $stmt = $dblink->prepare("UPDATE my_table SET col1 = ? , col2 = ? WHERE id = ?");
$rc = $stmt->bind_param("ssi", $c1, $c2, $id);
foreach ($items as $item) {
    $c1 = $item['c1'];
    $c2 = $item['c2'];
    $id = $item['id'];
    $rc = $stmt->execute();
}
$stmt->close();
  

Комментарии:

1. «100 обновлений занимают 4 секунды»? — Вы уверены? Это очень низкая производительность

2. Это может быть просто проблема с сетью. Фактический код и база данных находятся на разных машинах.

3. Проверьте также свою индексацию. Убедитесь, что все, что вы помещаете в предложение where вашего оператора update, проиндексировано.

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

Ответ №1:

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

 INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE 1=VALUES(a), b=VALUES(b), c=VALUES(c);
  

Ответ №2:

Попробуйте ЗАГРУЗИТЬ ДАННЫЕ в ФАЙЛ. Намного быстрее, чем ВСТАВКИ MySQL или ОБНОВЛЕНИЯ, при условии, что вы можете получать данные в плоском формате.