使用InnoDB时,有没有办法在MySQL中执行低优先级更新?发布低优先级更新
我运行一个非常高负载的应用那里可以很容易地从字面上成千上万的用户试图同时更新相同的数据记录。这主要是基于会话的统计信息,如果有与请求相关的等待时间,其中大部分可以忽略。我希望能够检查某些表/行是否被锁定,如果是这样,则不会将更新查询传递给服务器。那可能吗?
使用InnoDB时,有没有办法在MySQL中执行低优先级更新?发布低优先级更新
我运行一个非常高负载的应用那里可以很容易地从字面上成千上万的用户试图同时更新相同的数据记录。这主要是基于会话的统计信息,如果有与请求相关的等待时间,其中大部分可以忽略。我希望能够检查某些表/行是否被锁定,如果是这样,则不会将更新查询传递给服务器。那可能吗?
如果你这么说是有时间限制与您可以使用存储过程跳过某些更新
请求事情是这样的:
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终止更快,锁定被释放)
您还可以将一个else
节点添加到if,因此它存储过程无法更新,要做自定义代码,如添加到队列中。
假设你想只在1秒间隔写入到活动表不加载太多,也许你有很多关于它的索引。在else节点上,您可以更新另一个充当队列的表,并且当您也进行更新时,队列将在IF true节点中清空。
你试过在my.cnf文件中设置low_priority_updates=1
吗?当更新或插入会锁定表时,这应该使select查询具有优先权。
因此,您的用户应用程序不会等待更新完成,并且不关心它是否完成,这可能是使用后台处理管理器(如Gearman)的合适上下文吗?
@clops:我在文档中注意到UPDATE LOW_PRIORITY和ISERT DELAYED不适用于InnoDB,所以删除了答案。 – Veger 2010-01-20 15:27:29
完全没问题!不管怎么说,还是要谢谢你! – clops 2010-01-20 16:40:04