对不起,如果这个问题很愚蠢或已被问到,但我找不到相关内容。
什么是SQL中唯一存储的最快/最佳方法
选项1:创建唯一索引,并使用try - >用PHP捕获块? 选项2:查询是否存在,然后对此进行操作?
我认为选项2是最好的,但是使用选项1我只有1个查询,如果不存在,则查询2个。
由于我需要尽可能地减少数据库查询,我会选择选项1,但不确定是否可以选择使用try块绕过它?
由于
答案 0 :(得分:1)
与所有优化相关的问题一样,anser是:嗯,这取决于。
但是让我们直截了当:如果你不想在字段或字段组合中重复值,那么使用主键或唯一索引约束只是为了确保数据的完整性不会受到影响。任何情况。
所以,你的问题是:如果数据违反唯一性限制,我应该在表中插入记录之前检查。
如果您不关心插入是否成功,请不要检查。此外,使用insert ignore,因此如果插入违反唯一性约束,您甚至不会收到错误消息。如果您想在一定时间内至少登录一次,请记录下这种情况。
考虑在每次插入和更新之前检查的成本是多少,如果数据违反任何约束以及您认为它会发生多久。如果这是一项代价高昂的操作,那么在您知道查询失败后,依赖索引来防止具有重复数据的插入并找出违反约束的数据。
不仅要考虑select的成本,还要考虑插入是否是更大事务的一部分,如果插入失败,可能必须回滚。在事务开始之前检查甚至是违反约束条件可能会对db的性能产生积极影响。
答案 1 :(得分:0)
我认为 实际上,请始终对要成为的字段使用 unique 属性- unique ! 如果无论如何您都不能这样做,并且还想事先了解表/集合中是否已存在所需的值,请另外使用if-Exists功能。
为什么没人呢? 可能是因为不正确的sharding key in mongodb在每个分片中都允许非唯一值! 无法提供SQL知识,但我认为方法相同-尽可能使用唯一索引。
成本效益 两种方法都消耗服务器资源,并且至少两次访问数据库服务器。
那有什么大不了的? 在未知的宇宙中,您发送了一个请求,以了解一个值是否存在并且响应为 false ,以告知您唯一性!到您在应用程序服务器中识别出它并请求插入时,可能是别人已经在繁忙的服务器中插入了相同的值!
由于索引不可用,服务器可能永远不会告诉您差异!
从这个角度来看,如果-唯一性那么重要,那么您应该首先在表或集合级别启用索引!
答案 2 :(得分:-1)
创建唯一的自动递增主键索引。 然后将数据插入SQL而不输入自动递增的主键索引值。
插入永远不会复制数据。