发布低优先级更新

时间:2010-01-20 12:49:44

标签: mysql concurrency locking innodb

使用InnoDB时,有没有办法在MySQL中执行低优先级更新?

我正在运行一个非常高负载的应用程序,其中可能很容易有成千上万的用户试图同时更新相同的数据记录。这主要是基于会话的统计信息,如果有与请求相关的等待时间,则可以忽略其中的大部分信息。我希望能够检查某些表/行是否被锁定,如果是这样,只是不将更新查询传递给服务器。这可能吗?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

如果您说请求有时间限制,您可以使用存储过程跳过某些更新

这样的事情:

DELIMITER $$

DROP PROCEDURE IF EXISTS `updateStats`  $$

CREATE PROCEDURE updateStats ()
BEGIN

DECLARE _B smallint(1) DEFAULT 0;
DECLARE _SECONDS INT DEFAULT 1;

-- http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html
SELECT GET_LOCK('myLabel1',_SECONDS) INTO _B;
IF _B = 1 THEN
    UPDATE table SET ........;
    SLEEP(_SECONDS);
    SELECT RELEASE_LOCK('myLabel1') INTO _B;
END IF;
END

这将确保如果您获得了持续_SECONDS的锁定,则确保没有其他过程在该时间范围内运行相同的代码。 需要睡眠以保持锁定1秒钟(就像SP更快终止,锁定被释放)

您还可以向if添加else节点,以便存储过程无法更新,以执行自定义代码,例如添加到队列。

假设您只想以1秒的间隔写入实时表,而不是加载太多,可能您的上面有很多索引。在else节点上,您可以更新充当队列的第二个表,并且当您还进行更新时,队列将在IF true节点中清空。

答案 2 :(得分:0)