MariaDB UPDATE小表中的大表

时间:2016-05-19 08:14:24

标签: sql sql-update mariadb

我想知道如何编写一个以小块更新大表的过程。有大量的例子,但其中90%的人使用TOP或ROWCOUNT,这在MariaDB中是不可用的,10%是非常复杂的。

(更新)
这是我想在小块上执行的代码。

UPDATE b_accounts BA
INNER JOIN (
    SELECT SUM(AVG_DELIVERY_PRICE * AMOUNT_UNIT * AMOUNT) TOTAL_AVG_DELIVERY_PRICE
        ,ACCOUNT_ID
    FROM b_orders
    GROUP BY ACCOUNT_ID
    ) BO ON BA.ACCOUNT_ID = BO.ACCOUNT_ID
SET BA.TOTAL_AVG_DELIVERY_PRICE = BO.TOTAL_AVG_DELIVERY_PRICE;

b_accounts内,表有超过200k的记录。我还是想要TO UPDATE TOTAL_AVG_DELIVERY_PRICE但每次迭代10k

1 个答案:

答案 0 :(得分:0)

恕我直言,您的程序将会有效但是它不是一种有效且更有效的方式来更新应对变化的实时在线数据。

批处理程序仅与处理时间一样好。如果b_orders中的10条记录发生了变化,您是否会再次为200k记录运行整个过程?无论你的“块”有多高效,你的b_account在变化时总是过时的。 (我不明白为什么人们建议那些TOP,ROWCOUNT虽然没有看到实际的数据CUD问题)

为了提高效率和简单易懂,你应该(必须在你的情况下)为b_orders表创建一个完整的CUD触发器。

CUD(创建,更新,删除)触发器的想法非常简单:只要b_orders表中有更改操作,只需执行计算并将其存储到b_accounts.TOTAL_AVG_DELIVERY_PRICE中。

新记录触发器的一个例子,很简单

CREATE TRIGGER update_ AFTER BEFORE INSERT ON b_orders
FOR EACH ROW 
BEGIN 
  UPDATE b_accounts 
  SET  b_accounts.TOTAL_AVG_DELIVERY_PRICE = 
  (  SELECT SUM(AVG_DELIVERY_PRICE * AMOUNT_UNIT * AMOUNT) 
     from b_orders
     where ACCOUNT_ID = NEW.ACCOUNT_ID )
  WHERE ACCOUNT_ID = NEW.ACCOUNT_ID 
END; 

为更新,删除创建类似的操作。 注意:我不保证上述触发器语法的正确性,请自行编写。这个答案只是为了让您有机会解决您的问题。

然后要“刷新”b_accounts表,您需要通过选择具有唯一ACCOUNT_ID的记录在b_orders表上运行虚拟更新(因此,当进入b_orders表中的相同account_id时,不要重复更新过程)。触发器将在现在和将来刷新您的b_orders。