假设我们有一个MySQL后端,其中一个表的主键定义了UNIQUE属性。我们正在从多个分布式系统接收数据,这些系统都具有相同/相似的实现。
在某些时候,我们会尝试批量插入,例如1000万个文档行,但我们只想存储数据,如果我们不违反唯一约束,哪种方法会更快/被认为 ok ..?
e.g
try {
//...try and insert the document
} catch(MySQLIntegrityConstraintViolationException e) {
//..do nothing, since this is already stored in the database
//move on to the next one..
}
或
//we try to find the document...
if(!documentFound) {
//we did not find a document with this id, so we can safely insert it..
//move on to the next one...
}
在我的脑海中我猜测,在这两种情况下,我们试图插入的id必须“找到”,因为我们必须验证唯一约束,但两者中的哪一个被认为或多或少与其速度相关?
附带问题:答案/结果(就例如速度而言)是否与例如与mongoDB相关的Mysql相同?
答案 0 :(得分:2)
你能不能只使用INSERT .. ON DUPLICATE。这样你不必担心他们的密钥是否已经存在?所以在你的情况下,你可以做
ON DUPLICATE KEY UPDATE id=id
答案 1 :(得分:2)
一般情况下,我会保留例外......例外情况:)换句话说,如果在正常工作流程中可能发生某些事情,我宁愿用常规if
来处理这个案例。空catch
子句通常表明存在错误。
另外,我宁愿使用INSERT IGNORE
构造(而不是ON DUPLICATE
- 它的工作正常,但我不喜欢hackish UPDATE id=id
。
如果使用IGNORE关键字,则会忽略执行INSERT语句时发生的错误。 (...)忽略错误可能会生成警告,但重复键错误不会。
答案 2 :(得分:1)
如果你坚持循环记录并逐一处理它,我会建议另一种方法
<强>伪代码强>
如果您有许多重复项,您将为自己节省大量(相对)昂贵的数据库调用。