【问题标题】:Issuing low priority updates发布低优先级更新
【发布时间】:2010-01-20 12:49:44
【问题描述】:

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

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

【问题讨论】:

  • @clops:我确实在文档中注意到 UPDATE LOW_PRIORITY 和 ISERT DELAYED 不适用于 InnoDB,因此删除了答案。
  • 没问题!还是谢谢!

标签: mysql concurrency locking innodb


【解决方案1】:

您是否尝试在 my.cnf 文件中设置 low_priority_updates=1?当更新或插入会锁定表时,这应该给予选择查询优先级。

【讨论】:

    【解决方案2】:

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

    类似这样的:

    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,您可以确保在该时间范围内没有其他程序运行相同的代码。 需要sleep来保持锁1秒(好像SP提前终止,锁就被释放了)

    你也可以在 if 中添加一个else 节点,这样存储过程就不能更新,做自定义代码,比如添加到队列中。

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

    【讨论】:

      【解决方案3】:

      所以您的用户应用程序不会等待更新完成,也不关心更新是否完成,这可能是使用后台处理管理器(例如Gearman)的合适上下文吗?

      【讨论】:

        猜你喜欢
        • 2020-12-21
        • 1970-01-01
        • 2020-03-22
        • 2010-10-01
        • 2021-05-14
        • 2014-08-05
        • 2015-02-11
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多