我有一个分析平台,有很多用户和数百次插入点击/分钟。
有时我看到完全相同的点击在同一秒内被插入到数据库中,并且它变成了另一个的副本。
我有一个系统检查表是否具有相同的值,如果找到一个则不让另一个插入。
但是在这种情况下,在我看来它们是在完全相同的毫秒内插入到数据库中的。
我可以在这里做什么?
最佳答案
我最喜欢的:insert ignore myTable (col1, col2, ...) ...
预先设置唯一键以禁止插入。看起来您不太在意之前是否插入了它,就像您在意最终结果不是骗子一样。
注意:唯一键可以是多列键(复合)
关于 insert ignore
的警告:如果没有仔细考虑它对需要知道该行确实已经存在的敏感系统的影响,就不应该实现它。它非常适合“确保它在那里”。
选项 B:可以研究意向锁,例如 here ,但专为您的特定用例而设计。转向快速的 INNODB 行级锁定,当然不是表锁。大多数事情都需要权衡取舍。锁定的缺点是降低了并发性。
选项 C: 适合胆小的人(有时是我)。如果被雇用并且不希望以后受到同行的强烈反对,这就是我会做的。执行 Insert ... on Duplicate Key Update
(IODKU
),并有一个像 touches
这样的伪造列,它是一个你递增的整数IODKU 的更新部分。示例如下:
insert myTable (col1, col2, col3) values (p1,p2,p3)
on duplicate key update touches=touches+1;
以上内容将采用最简约的形式。下面的 View 是我在 C#
中使用的 View ,其中我关心“IODKU 的更新部分”中的更多列,但只是为了表明这一点,如果它对任何人都有好处:
关于 IODKU 的最后一个想法:必须有一个导致“冲突”发生的唯一 key (主 key 或唯一 key )。因此,该语句知道是否执行插入或更新。如果没有这种独特的键冲突,将插入一个新行。
回到操作问题,您的系统可能已经有行的原因是由于没有锁定的高并发使用。
关于php - 如何避免向 MySQL 中插入重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38531506/