Mysql UPDATE在首次检查之前是否有必要或只是UPDATE?

时间:2011-05-26 15:22:44

标签: mysql optimization select

当满足条件时,我正在使用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?混合表类型有任何缺点吗?

2 个答案:

答案 0 :(得分:2)

您只需进行更新,之前没有选择:

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

如果不符合条件,更新将不执行任何操作 此更新非常快如果您在status以及IDtopicIDuser上有索引! 空更新与空选择一样快。

如果你先选择选择,你就会毫无理由地减慢速度。

如果您想知道更新的行数

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语句。它   无论是否有   在声明中的条件是什么   将排除行