gpt4 book ai didi

php - 提高先选择然后插入的性能以避免重复记录(在mysql和php中)?

转载 作者:行者123 更新时间:2023-11-29 09:35:23 24 4
gpt4 key购买 nike

为了避免重复插入,我知道我可以在 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”是否值得麻烦?

最佳答案

假设您只需要 INSERT INTO ... IGNORE 功能,我建议只在相关表上创建一个唯一索引。

ALTER TABLE yourTable ADD CONSTRAINT cnstr UNIQUE KEY (col1, col2, ...);

有了这个,任何插入重复记录的尝试都会导致 PHP 端出现应用程序错误,您可以轻松捕获并处理该错误。

在尝试插入之前先执行插入以检查是否存在重复项的问题在于,只有在确保从选择时间到插入完成期间表中没有发生其他 DML 事件时,此类逻辑才会起作用。否则,可能会出现如下情况:

process1: SELECT to check if record exists (assume it does not)
process2: INSERT record (which process1 wants to insert)
process1: INSERT same record (now a duplicate exists)

换句话说,您的 PHP 应用程序会“认为”不存在重复记录,并插入该记录。但是,在 select 和 insert 之间的时间里,另一个进程恰好插入了相同的记录。

为了避免这种情况,我相信您需要类似可序列化事务的东西。但是,使用唯一约束要干净得多,并且将此责任主要交给数据库来处理。

关于php - 提高先选择然后插入的性能以避免重复记录(在mysql和php中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com