gpt4 book ai didi

Mysql 在必要时首先检查之前更新还是只是更新?

转载 作者:行者123 更新时间:2023-11-29 02:05:51 24 4
gpt4 key购买 nike

我正在使用 mysql 在满足条件时更新表中的字段...

我应该先执行 SELECT 以查看是否满足条件,还是每次都尝试使用 UPDATE,因为如果不满足条件,则什么也不会发生。

具体来说,这是我的选择:

SELECT * FROM forum_subscriptions 
WHERE IDTopic=11111 AND IDUser=11111 and status=0

我正在检查我是否在论坛主题 11111 上,如果我(用户 ID 1)订阅了这个主题并且我的订阅状态为 0(这意味着他还没有收到有关新帖子的电子邮件在主题中)

所以当遇到这种情况时:

UPDATE forum_subscriptions SET Status=1 where IDTopic=11111 AND IDUser=1

现在我想知道,我总是在这里做一个选择来查询用户是否订阅了这个主题,并且他的状态是他之前访问过该主题,所以任何新帖子都不会触发新的电子邮件通知。当他再次访问该页面时,会触发重置访问的更新,因此任何新帖子都会再次向他发送电子邮件。

因此,无论是否订阅,都会对每个用户进行选择以测试订阅。仅在必要时进行更新。

只使用更新是否更好?尝试在每个页面上更新,如果他没有订阅该主题,则不会更新任何内容。

不产生任何有效数据的更新有多快?内部是怎么制作的,update怎么找到有没有记录,是select然后update吗?如果是这样,最好只更新,因为我可以在没有任何减速的情况下实现同样的目标。如果更新比选择更昂贵,我应该先尝试检查,然后在必要时更新。

这个例子是一个真实的例子,但是这个更新/选择背后的逻辑才是我真正感兴趣的,因为我确实经常发现这种问题。

谢谢

UPDATE: 谢谢两位,但我没有在您的链接上看到 UPDATE 是否锁定,即使没有结果也是如此。由于您给出了不同的答案,我仍然不知道该怎么做。

订阅表真的不需要是myisam,我可以把它改成InnoDB,因为我不需要全文。这是一个很好的解决方案,只使用更新并将这个小表更改为 inno 吗?混合表类型有什么缺点吗?

最佳答案

你只是做更新,没有之前的选择:

UPDATE forum_subscriptions SET Status=1 where IDTopic=11111 AND IDUser=1 

如果条件不满足,update什么都不做。
此更新非常快如果您有关于statusIDtopicIDuser 的索引!
空更新与空选择一样快。

如果你先做选择,你会无缘无故地减慢速度。

如果你想知道更新了多少行

SELECT ROW_COUNT() as rows_affected

执行更新后,如果没有更新的行,这将告诉您 0,或者更新的行数(或者插入或删除,如果您使用这些语句)
这个函数非常快,因为它只需要从内存中获取一个值。

表锁定问题的解决方法

参见此处:http://dev.mysql.com/doc/refman/5.5/en/table-locking.html

关于Mysql 在必要时首先检查之前更新还是只是更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6141027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com