首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高select first insert的性能以避免重复记录(在mysql &php中)?

提高select first insert的性能以避免重复记录(在mysql &php中)?
EN

Stack Overflow用户
提问于 2019-09-02 13:13:18
回答 2查看 147关注 0票数 0

为了避免重复插入,我知道我可以使用“insert IGNORE”或“INSERT…”在mysql中更新重复密钥“。

但我使用的是laravel,我知道firstOrCreate不会这样做。它首先进行SELECT以查看条目是否存在,然后仅当SELECT没有返回任何记录时才插入。我猜这是因为DUPLICATE KEY UPDATE是特定于MySQL的。

从性能的角度来看,我先选择再插入,这真的很糟糕。与“INSERT IGNORE”或“INSERT…”相比,这会对性能产生多大影响在重复密钥更新时“?

不使用firstOrCreate并编写自己的php代码来“插入忽略”或“插入…”是否值得呢?在重复密钥更新时“?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-02 14:06:59

假设您只需要INSERT INTO ... IGNORE功能,我建议您只在有问题的表上创建一个惟一的索引。

代码语言:javascript
复制
ALTER TABLE yourTable ADD CONSTRAINT cnstr UNIQUE KEY (col1, col2, ...);

执行此操作后,任何插入重复记录的尝试都会在PHP端导致应用程序错误,您可以轻松地捕获和处理该错误。

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

代码语言:javascript
复制
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之间的时间内,另一个进程恰好插入了相同的记录。

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

票数 1
EN

Stack Overflow用户

发布于 2019-09-02 16:29:55

也许可以在mysql中尝试REPLACE:

代码语言:javascript
复制
REPLACE ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57751702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档