Для определенной части бизнес-логики последовательность может быть либо двумя отдельными обновлениями, либо удалением, за которым следует вставка. В принципе, обновление приведет к аннулированию столбца, поэтому я могу сделать его похожим на удаление. Меня не интересуют потери строк (так что мягкое удаление не требуется): какой более эффективный подход?Что более дорого, 2 обновления, или удалить и вставить?
ответ
Это дико зависит от характера запросов. Возможно, ваши два обновления могут быть записаны как соединение для обновления и быть быстрее, чем удаление и вставка. Если у вас есть индексы на вашем столе, удаление и вставка будут много более дорогостоящим. Если это столбец переменной длины, возможно, удаление и вставка быстрее.
В него входит множество факторов. Лучше всего сравнить его и использовать explain
, чтобы выяснить, что именно делает база данных с каждым вашим запросом.
Похоже, что с точки зрения целостности данных вам будет лучше идти с удалением, а затем вставить.
И удаление данных, которые вам не нужны, явно менее дорогостоящее, чем их сохранение.
Что касается фактической скорости, я бы предположил, что это пренебрежимо мало, если профилирование не докажет обратное.
Бенчмарк их. Не забудьте также проверить другие запросы в таблице (таблицах).
Еще лучше, выберите, какой из них приведет к самой разумной модели данных.
Обновление обычно будет быстрее, чем удаление/вставка. MySQL performance DELETE or UPDATE?
Лучше всего измерить, но это помогает понять, что происходит на уровне диска. Вот что происходит концептуально:
Если обновления относятся к столбцам, которые не относятся к индексу, то обновления могут выполняться «на месте» в одной записи, если только запись не растет (что, если вы мягко удаляете поле, маловероятно). Если индексы индексируются, будут записываться эти индексы, чтобы удалить старые значения и добавить новые.
Когда вы удаляете, будет запись для удаления первичного ключа для записи удаления из его индекса и записи для удаления любых вторичных ключей из вторичных индексов.
Когда вы вставляете, будут записываться записи, которые вы добавляете, одну или несколько записей, чтобы получить первичный ключ в индекс (страницы индекса могут разбиваться, требуя многократной записи) и записывать, чтобы получить какие-либо вторичные ключи в свои индексы.
В большинстве баз данных есть опции (например, «объясните»), которые подробно излагают, какую работу они должны выполнять, чтобы удовлетворить определенный запрос и какова стоимость. Вы пытались использовать это на своих целевых РСУБД? – Promit
Я попробую это ... спасибо – 2009-08-19 04:33:12