2012-01-20 2 views
5

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

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

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

Спасибо.

ответ

7

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

0

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

0

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

0

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

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

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

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

0

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

Заканчивать - http://vadivel.blogspot.com/2011/09/upsert-insert-and-update-in-sql-server.html

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

EDIT: Обратите внимание: я знаю, что это работает для MS SQL Server, и я не знаю о MySQL или ORACLE

Смежные вопросы