【发布时间】:2020-01-05 04:21:28
【问题描述】:
为了避免重复插入,我知道我可以在 mysql 中使用“INSERT IGNORE”或“INSERT ... ON DUPLICATE KEY UPDATE”。
但我正在使用 laravel,我知道 firstOrCreate 不会那样做。它首先进行 SELECT 以查看条目是否存在,并且仅当 SELECT 没有返回记录时才进行 INSERT。我想这是因为DUPLICATE KEY UPDATE 是 MySQL 特有的。
从性能的角度来看,我先选择然后插入真的很糟糕吗?与“INSERT IGNORE”或“INSERT ... ON DUPLICATE KEY UPDATE”相比,这会对性能造成多大影响?
不使用 firstOrCreate 并将我自己的 php 代码写入“INSERT IGNORE”或“INSERT ... ON DUPLICATE KEY UPDATE”是否值得麻烦?
【问题讨论】:
-
问题:如果插入因重复问题而失败,您希望发生什么?你真的要更新,还是仅仅失败就足够了?
-
如果选择只使用主键并且您有合理数量的行,我会说一般使用中的性能影响可以忽略不计。虽然您可能会遇到转储问题,但在这种情况下,您通常不介意额外的时间来完成任务。
-
你可以使用 Laravel DB Statement 来编写你自己的查询。如果索引正确,firstOrCreate 不会产生那么多问题。
-
@TimBiegeleisen 我只需要插入忽略。但我对先选择然后插入的性能影响感兴趣。
-
@mikiqex 您是否有实际数据来备份您的陈述,即“一般使用中的性能影响可以忽略不计”。 ?