Вставляет ли новая запись в базу данных быстрее, чем проверяет, существует ли эта запись первой? - PullRequest
6 голосов
/ 20 января 2012

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

Мне также сказали, что большинствобазы данных сильно оптимизированы для чтения, а не записи, поэтому быстрая проверка не была бы быстрее, чем медленная вставка?

Это вопрос ожидаемого числа коллизий?(То есть, вставлять быстрее, только если существует низкая вероятность того, что запись уже существует.) Зависит ли это от типа используемой базы данных?И если уж на то пошло, это плохая практика иметь метод, который будет постоянно добавлять ошибки вставки в мой журнал ошибок?

Спасибо.

Ответы [ 5 ]

7 голосов
/ 20 января 2012

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

0 голосов
/ 20 января 2012

Если вы намереваетесь вставить, если это новая запись, ИЛИ обновить запись, если она уже существует, тогда как насчет UPSERT?

Проверить - http://vadivel.blogspot.com/2011/09/upsert-insert-and-update-in-sql-server.html

Вместо проверкисуществует ли запись или нет, мы можем попытаться обновить ее напрямую.Если нет подходящей записи, тогда @@ RowCount будет равно 0. На основании этого мы можем вставить ее как новую запись.[В SQL Server 2008 вы можете использовать концепцию MERGE для этого]

РЕДАКТИРОВАТЬ: Обратите внимание, я знаю, что это работает для MS SQL Server, и я не знаю о MySQL или ORACLE

0 голосов
/ 20 января 2012

Если вы хотите удалить старое значение и вставить новое значение, вы можете использовать REPLACE Вы можете использовать REPLACE вместо INSERT для перезаписи старых строк.

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед вставкой новой строки.

В противном случае используйте INSERT IGNORE , поскольку он либо вставляет, либо игнорирует.

строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дубликата ключа, и оператор отменяется. При IGNORE строка все еще не вставляется, но ошибка не выдается.

0 голосов
/ 20 января 2012

Я думаю, что INSERT IGNORE INTO .... можно использовать здесь, он будет вставлять или игнорировать его. Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT, вместо этого рассматриваются как предупреждения. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дубликата ключа, и оператор прерывается. При IGNORE строка все еще не вставляется, но ошибка не выдается.

0 голосов
/ 20 января 2012

Вы можете использовать INSERT IGNORE, чтобы, если ключ уже существовал, команда вставки просто игнорировалась, иначе будет вставлена ​​новая строка.Таким образом, вам нужно выполнить один запрос, который проверяет дублирующиеся значения, а также вставляет новые значения.
все же Будьте осторожны с INSERT IGNORE, поскольку он превращает КАЖДУЮ ошибку в предупреждение.Прочитайте этот пост для вставки игнорировать
При дублировании ключа игнорировать?

...