2011-05-26 67 views
2

我使用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 

现在我想知道,我总是做一个选择这里询问如果用户订阅了这个主题,并且他有一个他访问该主题的状态,那么任何新帖子都不会触发新的电子邮件通知。当他再次访问该页面时,会触发更新以重置访问,以便任何新帖子将再次向他发送电子邮件。

因此,如果每个用户订阅或不测试订阅,则选择每个用户。只有在必要时才进行更新。

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

更新不会产生任何有效数据的速度有多快?内部是如何制作的,更新如何查找是否有任何记录,它是否选择并更新?如果是这样,只更新会更好,因为我会在不减速的情况下实现同样的目标。如果更新比选择更贵,我应该先尝试检查,然后根据需要进行更新。

这个例子是一个真实的例子,但是这个更新/ select的逻辑实际上是我感兴趣的,因为我更经常发现这种类型的问题。

感谢名单

UPDATE:感谢名单都可以的,但我不上你的链接看是否更新锁定,即使没有结果还是不行。当你给出不同的答案时,我仍然不知道该怎么做。

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

+0

语句条件是你是问关于'InnoDB'或'MyISAM'表? – 2011-05-26 15:29:48

+0

我使用myISAM表,但我想我可以使用这个订阅表是INNODB,因为我不需要全文...它是否聪明将其更改为innodb并仅使用更新? – Jerry2 2011-05-26 16:11:09

回答

2

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

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

如果条件得不到满足,更新不会做任何事情。
这个更新是非常快的如果你有一个索引statusIDtopicIDuser
空更新与空选择一样快。

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

如果你想知道有多少行,其中更新做

SELECT ROW_COUNT() as rows_affected 

做更新后,这会告诉你0,如果没有行,其中更新或更新(或插入的行数或删除,如果你使用这些语句)
这个功能超快,因为它只需要从内存中获取一个值。

解决方法表锁定问题

在这里看到:总是调用UPDATEhttp://dev.mysql.com/doc/refman/5.5/en/table-locking.html

+0

Thanx很多,所以更新本身,如果首先作出选择,看看是否更新?我的意思是,不是订户的用户不会因为此更新声明而真正锁定myisam表? – Jerry2 2011-05-26 15:32:45

+0

我在哪里做SELECT ROW_COUNT()?更新后?如果在两次查询之间发生另一次更新会怎么样? – Jerry2 2011-05-26 15:35:08

+0

Thanx的更新。但是,如果在网站上某处发生了其他更新,我会得到一个错误的ROW_COUNT()? – Jerry2 2011-05-26 15:37:51

1

潜在侧影响是一个需要投入,以确保没有其他连接修改这些行锁定。

  • 如果表格为MyISAM - 在搜索过程中会在整个表格上放置锁定。
  • 如果该表为InnoDB,锁定将位于索引/间隙中。

Docs

锁定读,一个UPDATE,或与该SQL语句的 处理扫描每 索引记录DELETE 一般设置记录锁。它 不要紧是否有 WHERE在 将排除行

+0

因此,即使结果为空,大多数情况下都会执行锁定操作?这实际上是一个如何在MySQL 5.6内部进行更新的问题。它是否首先选择,如果它发现它更新的记录,或者它只是试图更新和锁定,即使没有记录。 – Jerry2 2011-05-26 15:33:56

+0

@ jerry2是的。如果您正在使用'InnoDB'表并且设计了合适的索引,那应该不成问题。 – 2011-05-26 15:36:37

+0

@ jerry2在需要更新记录的* search *期间放置锁。 – 2011-05-26 15:37:14

相关问题