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