是否插入新数据库条目比检查条目是否存在更快?

时间:2012-01-20 04:58:21

标签: mysql sql sql-server oracle database-optimization

我曾被告知,只是运行插入并让插入失败比检查数据库条目是否存在然后插入(如果它丢失)更快。

我还被告知,大多数数据库都经过大量优化,无法读取阅读而不是写入,因此快速检查不会比慢速插入更快?

这是预期碰撞次数的问题吗? (IE只有在条目已经存在的可能性很小的情况下插入才会更快。)它是否依赖于我正在运行的数据库类型?就此而言,有一种方法会不断向我的错误日志添加插入错误,这是不好的做法吗?

感谢。

5 个答案:

答案 0 :(得分:7)

如果插入因索引违规而失败,那么它最多会比检查记录存在的速度慢一些。 (两者都需要检查索引是否包含该值。)如果插入成功,则发出两个查询要比发出一个查询慢得多。

答案 1 :(得分:0)

您可以使用INSERT IGNORE,这样如果密钥已经存在,则只会忽略insert命令,否则将插入新行。这样您就需要发出一个查询,它会检查重复值以及插入新值 还是要小心INSERT IGNORE,因为它会将每个错误变成警告。阅读此文章以插入忽略
On duplicate key ignore?

答案 2 :(得分:0)

我认为INSERT IGNORE INTO ....可以在这里使用,要么插入要么忽略它。 如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但未发出错误。

答案 3 :(得分:0)

如果要删除旧值并插入新值,可以使用REPLACE您可以使用REPLACE而不是INSERT来覆盖旧行。

  

REPLACE的工作方式与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。

否则使用INSERT IGNORE,因为它会插入或忽略。

  

复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将被中止。使用IGNORE时,仍未插入行,但未发出错误。

答案 4 :(得分:0)

如果您的意图是插入新的记录或更新记录(如果它已经存在)那么如何进行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