Подтвердить что ты не робот

UPDATE vs INSERT

Правильно ли я предполагаю, что запрос UPDATE требует больше ресурсов, чем запрос INSERT?

4b9b3361

Ответ 1

Я не гуру базы данных, но вот мои два цента:

Лично я не думаю, что у вас есть много дел в этом отношении, даже если INSERT будет быстрее (все будет доказано), вы можете конвертировать обновление во вставку?! Честно говоря, я не думаю, что вы можете сделать это все время.

Во время INSERT вам обычно не нужно использовать WHERE, чтобы определить, какую строку обновлять, но в зависимости от ваших индексов в этой таблице операция может иметь определенную стоимость.

Во время обновления, если вы не измените ни один столбец, включенный в какие-либо индексы, у вас может быть быстрое выполнение, если предложение where достаточно простое и быстрое.

Ничего не написано на камнях, и на самом деле я думаю, что это зависит от настройки всей базы данных, индексов и так далее.

Во всяком случае, нашел этот в качестве ссылки:

84 совета по производительности MySQL

Ответ 2

Если вы планируете выполнять большую обработку (например, оценку или выставление счетов для сотовой компании), этот вопрос оказывает огромное влияние на производительность системы.

Выполнение крупномасштабных обновлений по сравнению с тем, что многие новые таблицы и индексы доказали, что мой процесс составления счетов моей компании составляет от 26 часов до 1 часа!

Я попробовал это на 2 миллиона записей для 100 000 клиентов. Сначала я создал таблицу фактурирования, а затем все клиентские сводные вызовы, я обновил таблицу фактурирования с продолжительностью, ценой, скидкой. Всего 10 полей.

Во втором варианте я создал 4 фазы. Каждая фаза считывает предыдущую таблицу (таблицы), создает индекс (после завершения таблицы) и использует: "insert into from select..". Я создал следующую таблицу для следующей фазы.

Резюме Хотя второй вариант требует гораздо большего дискового пространства (все представления и временные таблицы удалены в конце), есть три основных преимущества для этого варианта: 1. Это было в 4 раза быстрее, чем вариант 1. 2. Если в середине процесса возникла проблема, я мог бы запустить процесс с той точки, в которой он не прошел, поскольку все таблицы для начала фазы были готовы, и процесс мог возобновиться с этой точки. Если процесс не реализует первый вариант, вам нужно будет запустить весь процесс заново. 3. Это сделало разработку и качество работы намного быстрее, поскольку они могли работать параллельно .

Ответ 3

Это зависит. Простое UPDATE, которое использует первичный ключ в предложении WHERE и обновляет только одно неиндексированное поле, вероятно, будет менее дорогостоящим, чем INSERT в той же таблице. Но даже это зависит от используемого механизма базы данных. Тем не менее, UPDATE, включающий изменение количества индексированных полей, может быть более дорогостоящим, чем INSERT в этой таблице, потому что потребуется больше изменений ключа ключа. UPDATE с плохо построенным предложением WHERE, которое потребовало бы сканирования таблиц миллионов записей, несомненно, было бы дороже, чем INSERT на этой таблице.

Эти утверждения могут принимать разные формы, но если вы ограничиваете обсуждение их "базовыми" формами, которые включают одну запись, тогда большая часть стоимости обычно будет посвящена изменению индексов. Каждое проиндексированное поле, которое было изменено во время UPDATE, обычно включает две основные операции (удалить старый ключ и добавить новый ключ), тогда как для INSERT потребуется один (добавить новый ключ). Разумеется, кластеризованный индекс затем добавит некоторую другую динамику, а также проблему блокировки, изолированность транзакций и т.д. Таким образом, в конечном счете, сравнение этих утверждений в общем смысле на самом деле невозможно и, возможно, потребует бенчмаркинга конкретных утверждений, если оно фактически имело значение.

Как правило, имеет смысл просто использовать правильный оператор и не беспокоиться об этом, так как обычно нет возможности выбирать между UPDATE и INSERT.

Ответ 4

Это зависит. Если обновление не требует изменений ключа, скорее всего, оно будет стоить только как поиск, а затем, вероятно, будет стоить меньше, чем вставка, если база данных не будет организована как куча.

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

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

Ответ 5

В Sybase/SQL Server обновление, которое влияет на столбец с индексом только для чтения, внутренне заменяется удалением, а затем вставкой, поэтому это явно медленнее, чем вставка. Я не знаю реализации для других движков, но я думаю, что это общая стратегия, по крайней мере, когда задействованы индексы. Теперь для таблиц без индексов (или для запросов на обновление, не связанных с каким-либо индексом), я полагаю, что есть случаи, когда обновление может быть быстрее, в зависимости от структуры таблицы.

Ответ 6

Ключевым ресурсом здесь является доступ к диску (IOPS, если быть точным), и мы должны оценить, какие из них приводят к минимуму этого.

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

Если это так (очень распространенный случай), обновление будет быстрее, чем вставка, потому что обновление включает индексированный поиск и изменение существующего значения, не касаясь индекса. Вы можете предположить, что один диск считывает данные и, возможно, записывает один диск. С другой стороны, вставка будет включать два диска, записывающих один для индекса, один для данных. Но другая скрытая стоимость - это разделение btree node и новое создание node, которое произойдет в фоновом режиме, в то время как вставка приведет к большему количеству доступа к диску в среднем.

Ответ 7

Вы не можете сравнивать INSERT и UPDATE в целом. Дайте нам пример (с определением схемы), и мы объясним, какой из них стоит больше и почему. Кроме того, вы можете составить конкретный INSERT и UPDATE, проверив их план и время выполнения.

Некоторые правила большого пальца:

  • если вы обновляете только одно поле, которое не индексируется, и вы только обновляете одну запись, и вы используете ключевой/первичный ключ, чтобы найти эту запись, то это ОБНОВЛЕНИЕ будет стоить меньше, чем
  • INSERT, который также будет влиять только на одну строку, хотя эта строка будет содержать множество индексированных полей с нулевым ограничением; и все эти индексы должны поддерживаться (например, добавить новый лист).