哪个更快,或者只是被认为是错误的代码

时间:2013-09-09 14:04:02

标签: java mysql database coding-style

假设我们有一个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相同?

3 个答案:

答案 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)

如果你坚持循环记录并逐一处理它,我会建议另一种方法

<强>伪代码

  1. 创建哈希表
  2. 在哈希表中搜索唯一键
  3. 如果找不到,请插入数据库。将唯一键添加到哈希表
  4. 获取下一条记录
  5. 如果不是eof,请转到2。
  6. 如果您有许多重复项,您将为自己节省大量(相对)昂贵的数据库调用。