首先检查mysql更新,如果有必要还是只是更新?

问题描述

| 满足条件时,我正在使用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:非常感谢你们,但是我看不到您的链接是否UPDATE锁定,即使没有结果也没有。当您给出不同的答案时,我仍然不知道该怎么办。 订阅表确实不需要是myisam,我可以将其更改为InnoDB,因为我不需要全文显示。仅使用update并将此小表更改为inno,这是一个好的解决方案吗?混合表类型是否有任何缺点?     

解决方法

您只需执行更新,而无需先前选择:
UPDATE forum_subscriptions SET Status=1 where IDTopic=11111 AND IDUser=1 
如果不满足条件,则更新将无效。 如果您在
status
IDtopic
IDuser
上有索引,则此更新非常快! 空更新与空选择一样快。 如果先进行选择,则无缘无故就会慢下来。 如果您想知道更新了多少行,请执行
SELECT ROW_COUNT() as rows_affected
完成更新后,如果没有行更新,或者更新(或插入或删除,如果使用了这些语句)行数,它将告诉您0。 此功能非常快,因为它只需要从内存中获取一个值即可。 表锁定问题的解决方法 看到这里:http://dev.mysql.com/doc/refman/5.5/en/table-locking.html     ,始终调用“ 7”的潜在副作用是必须进行锁定,以确保没有其他连接会修改这些行。 如果桌子是
MyISAM
-在搜索过程中,整个桌子上都会放一个锁。 如果表为“ 9”,则锁将位于索引/间隙上。 从文档中:   锁定读取,UPDATE或DELETE   通常在每个上设置记录锁定   在中扫描的索引记录   SQL语句的处理。它   是否有没有关系   陈述中的条件   将排除该行     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...