当满足条件时,我正在使用mysql来更新表中的字段...
我应该首先执行SELECT以查看是否满足条件,或者我是否每次都尝试使用UPDATE,因为如果不满足条件,则不会发生任何事情。
具体来说,这是我的SELECT:
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
现在我想知道,我总是在这里选择查询用户是否订阅了这个主题,并且他的状态是他之前访问过该主题,因此任何新帖子都不会触发新的电子邮件通知。当他再次访问该页面时,会触发更新以重置访问,因此任何新帖子都会再次向他发送电子邮件。
因此,如果订阅或不测试订阅,则对每个用户进行选择。只在必要时才进行更新。
仅使用更新会更好吗?要尝试在每个页面上更新,如果他没有订阅该主题,它将不会更新任何内容。
不会产生任何有效数据的更新速度有多快?它是如何在内部制作的,如果有任何记录,更新如何查找,是否选择然后更新?如果是这样的话,最好只更新,因为我会在没有任何减速的情况下实现相同的目标。如果更新比选择更贵,我应该先尝试检查,然后在必要时进行更新。
这个例子是一个真实的例子,但是这个更新/选择的逻辑正是我感兴趣的,因为我确实经常发现这种问题。
感谢名单
更新: Thanx这两个人,但是我没有在你的链接上看到UPDATE是否锁定,即使没有结果。当你给出不同的答案时,我仍然不知道该怎么做。
订阅表确实不需要是myisam,我可以将其更改为InnoDB,因为我不需要全文。这是一个很好的解决方案,只使用更新并将这个小表更改为inno?混合表类型有任何缺点吗?
答案 0 :(得分:2)
您只需进行更新,之前没有选择:
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
答案 1 :(得分:1)
始终调用UPDATE
的潜在副作用是需要进行锁定以确保没有其他连接修改这些行。
MyISAM
,则在搜索过程中会锁定整个表格。InnoDB
,则锁定将位于索引/间隙上。来自Docs:
锁定读取,UPDATE或DELETE 通常在每一个上设置记录锁 在中扫描的索引记录 处理SQL语句。它 无论是否有 在声明中的条件是什么 将排除行