MySQL效率:选择5k记录或100上的错误?

时间:2014-02-01 17:18:57

标签: mysql

我的问题是关于特定情况的最佳做法。

每天,大约有5k条记录被插入到表格中。它们在4列上是独一无二的。发生的事情是,在此过程中大约100次,系统再次处理信息并尝试插入它们,MySQL正确返回完整性约束错误。

这是我的问题: 什么是更有效率和最佳实践:继续让返回错误或者在插入它们之前对所有5000条记录运行选择以查看它们是否已经存在,如果是,则返回现有记录的PK?

谢谢你的时间!

更新:

这些是5k SINGLE插页。

我目前没有以任何方式处理错误,我知道这很糟糕。如果你能指出我正确的方向,我将不胜感激。示例如下。插入只是炸弹,系统继续处理下一条记录。

警告:PDOStatement :: execute()[pdostatement.execute]:SQLSTATE [23000]:完整性约束违规:1062重复条目'1-Bananas 4 oz-Produce'用于键'store_id_2'在 /path/to/file/database.class.php 的第 53

1 个答案:

答案 0 :(得分:0)

您还有其他选择。

你可以这样做:

insert ignore into . . .

这将忽略任何错误,因此不会报告。我并不是真的建议这个,因为它会忽略任何类型的错误,你只想忽略一种类型。

你也可以这样做:

insert into . . .
    on duplicate key update blah = blah;

这是blah是任意列的地方。这基本上是on duplicate key ignore,所以它只在违反约束时才进行更新 - 这实质上忽略了这种违规。进行更新时,实际上什么都没做,只有轻微的开销。在insert的上下文中,这是非常小的。

你也可以这样做:

insert into . . .
    select . . .
    from dual
    where not exists (select 1 from t where keys = keyvalus being inserted);

这是一个显式测试,仅在值不存在时插入。

最后两个选项的开销最小。在任何插入表中,MySQL需要在唯一索引中查找密钥以保证唯一性。因此,明确地这样做不会给查询增加太多成本。