#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 или ОБНОВЛЕНИЯ, при условии, что вы можете получать данные в плоском формате.