【问题标题】:Is inserting a new database entry faster than checking if the entry exists first?插入新数据库条目是否比先检查条目是否存在更快?
【发布时间】:2012-01-20 04:58:21
【问题描述】:

曾经有人告诉我,只运行插入并让插入失败比检查数据库条目是否存在然后在缺少时插入要快。

我还被告知,大多数数据库都针对读取而不是写入进行了高度优化,所以快速检查不会比慢速插入更快吗?

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以使用INSERT IGNORE,这样如果键已经存在,则插入命令将被忽略,否则将插入新行。这样,您需要发出一个查询,该查询会检查重复值并插入新值。
      仍然要小心 INSERT IGNORE 因为它会将每个错误都变成警告。阅读这篇文章以了解插入忽略
      On duplicate key ignore?

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-11-26
              • 1970-01-01
              • 1970-01-01
              • 2016-07-28
              • 2018-04-22
              • 1970-01-01
              相关资源
              最近更新 更多