【问题标题】:Fastest vs best - unique index or check if exists最快与最佳 - 唯一索引或检查是否存在
【发布时间】:2016-01-13 20:34:04
【问题描述】:

如果这个问题很愚蠢或已经被问过,我很抱歉,但我找不到太多关于它的信息。

在 SQL 中唯一存储的最快/最佳方法是什么

选项 1:创建唯一索引,并在 PHP 中使用 try -> catch 块? 选项 2:查询以检查是否存在,然后采取行动?

我认为选项 2 是最好的,但使用选项 1 我只有 1 个查询,如果不存在则有 2 个查询。

由于我需要尽可能减少数据库查询,我会选择选项 1,但不确定使用 try 块绕过它是否是一个好的选择?

谢谢

【问题讨论】:

  • 创建Unique Index,然后使用INSERT IGNORE,可能是最好的方法。
  • 是的,这很好,我忘记了 IGNORE 语句,但是 IGNORE 好用吗?
  • 是的,如果你想删除IGNORE,还有很多其他选项,比如使用mysql的REPLACEINSERT (...) ON DUPLICATE KEY UPDATE...,这些会有点慢,因为INSERT或@987654327 @ 将发生。

标签: php mysql


【解决方案1】:

与所有与优化相关的问题一样,分析器是:好吧,这取决于。

但是让我们直截了当地说:如果您不想在一个字段或字段组合中出现重复值,那么使用主键或唯一索引约束只是为了确保在任何情况下都不会损害数据的完整性。

所以,你的问题真的是:我是否应该在向表中插入记录之前检查数据是否会违反唯一性约束。

  1. 如果您并不真正关心插入是否成功,则不要检查。此外,使用插入忽略,因此如果插入违反唯一性约束,您甚至不会收到错误消息。这种情况可能是,如果用户在某个时间段内至少登录一次或不登录,则要登录。

  2. 考虑在每次插入和更新之前检查数据是否违反任何约束以及您认为它会发生的频率是多么昂贵。如果是代价高昂的操作,那么依靠索引来防止重复数据的插入,并在知道查询失败后找出哪些数据违反了约束。

不仅要考虑选择的成本,还要考虑插入是否是较大事务的一部分,如果插入失败,则可能必须回滚。在事务开始之前检查是否违反约束可能会对您的数据库性能产生积极影响。

【讨论】:

【解决方案2】:

在我看来 始终为您想成为的字段使用 unique 属性,实际上 - unique ! 如果无论如何您都不能这样做,并且还想事先知道表/集合中是否已经存在所需的值,那么另外使用 if-Exists 功能。

为什么没有人? 可能是因为不正确的sharding key in mongodb 允许每个分片中存在非唯一值! 无法提供 SQL 知识,但我认为方法相同 - 尽可能使用唯一索引。

成本效益 这两种方法都会消耗服务器资源并至少两次访问数据库服务器。

那么有什么大不了的? 在未知的宇宙中——您发送了一个请求以了解某个值是否存在并且响应为 false 以让您知道唯一性!当您在应用程序服务器中识别它并请求插入时,可能已经有人在繁忙的服务器中插入了相同的值!

由于索引不可用,服务器可能永远不会告诉您差异!

对于这个观点,如果 - 唯一性 很重要,那么您应该首先在表或集合级别启用索引!

【讨论】:

    【解决方案3】:

    创建唯一的自动递增主键索引。 然后在不输入自动递增的主键索引值的情况下将数据插入 SQL。

    插入永远不会复制数据。

    【讨论】:

    • 这意味着每次插入。但是,当您必须检查值的预先存在时,就会出现这种情况。然后你需要通过调用检查方法或读取服务器响应等来验证它。
    猜你喜欢
    • 2015-08-10
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多