【问题标题】:Setting MySQL unique key or checking for duplicate in application part?在应用程序部分设置 MySQL 唯一键或检查重复项?
【发布时间】:2012-02-22 23:45:59
【问题描述】:

哪个更可靠,性能更好?设置 MySQL 唯一键并使用 INSERT IGNORE 或首先检查数据库中是否存在数据并根据结果进行操作?

如果答案是第二个,有没有什么办法可以做一个 SQL 查询而不是两个?

更新:我问是因为我工作的公司的同事认为处理此类问题应该在应用程序部分完成,据他们说这更可靠。

【问题讨论】:

标签: mysql sql duplicates unique unique-key


【解决方案1】:

您的应用程序不会捕获重复项。

两个并发调用可以插入相同的数据,因为在您的应用程序检查唯一性时,每个进程看不到另一个。每个进程都认为可以插入。

您可以强制进行某种序列化,但会遇到瓶颈和性能限制。而且您让其他客户端写入数据库,即使它只是一个发布脚本-

这就是为什么通常会有唯一索引和约束之类的东西。外键、触发器、检查约束、NULL/NIOT NULL、数据类型约束都用于强制数据完整性

还有一些代码猴子认为自己可以做得更好的傲慢。

查看programmers.se:Constraints in a relational databases - Why not remove them completely? 和这个Enforcing Database Constraints In Application Code (SO)

【讨论】:

    【解决方案2】:

    设置唯一键更好。减少单次操作往返mysql的次数,保证item的唯一性,减少自己的逻辑导致的错误。

    【讨论】:

      【解决方案3】:

      无论您决定什么,都绝对应该在您的 MySQL 表中设置一个唯一键。

      就您问题的另一部分而言,如果您打算对您的应用程序执行此操作,请务必在重复键更新时使用插入忽略。

      即如果您要加载一堆数据并且您不在乎旧数据是什么,您只需要新数据,这就是要走的路。

      另一方面,如果存在某种基于更改是更新还是新值的决策分支,我认为您将不得不选择选项 2。

      即如果对表的更改记录在其他表中(例如表:change_log,列:id,table,column,old_val,new_val),那么您不能只使用 INSERT IGNORE 因为您永远无法分辨哪些值是更改与新插入的。

      【讨论】:

        猜你喜欢
        • 2017-01-14
        • 2016-08-05
        • 2018-06-06
        • 1970-01-01
        • 2018-11-13
        • 2018-06-05
        • 2014-01-12
        • 1970-01-01
        • 2017-04-22
        相关资源
        最近更新 更多