2

我想计算 mysql 中数百万条记录的利息。所以我正在使用调度程序

create event cal_interest 
on every 1 day 
do 
update 
userTable
set interest=(money*rate)/100 

我的问题是:
1. 是否有可能同时更新数百万条记录?
2.任何可能的一些记录更新和一些失败。
3. 如果计算多条记录的利息方法错误,请建议我怎么做?

4

1 回答 1

3
  1. 一般来说,一次更新数百万行并不是一个好主意。特别是如果你有数据库集群(几乎肯定会有复制延迟)。更好的策略是将更新分成批次。

  2. 是的。总是有失败的可能

  3. 请参阅 1 :) 将您的表拆分为 N 条记录的批次(N 从 100 到 1000)并逐批更新它们。其中一种策略是创建一个客户端作业来启动和监控这些批量更新。(一种可能的方法:添加一个索引字段来存储上次更新的日期,然后选择 N 行 last_update_date < current_date)

评论:我所说的“拆分桌子”并不是指物理上的拆分,只是以下内容:

  • 添加保存上次同步日期的字段(并使其编入索引)(例如 last_sync_date);

  • 当作业开始时,在循环内执行以下操作:

    • 使用 last_sync_date < curdate() 检索下 N 条记录的 ID(例如 N=500):

    • 如果你没有得到任何东西,你就完成了,退出循环;

    • 否则,set interest=(money*rate)/100, last_sync_date = curdate()对于具有这些 ID 的记录。

    我宁愿将其作为在 MySQL 之外编写并通过例如 cron 安排的作业来完成(因为这样更容易监控作业的运行方式并在必要时将其终止),但理论上你也可以在 MySQL 中执行此操作,例如(未经测试)类似的东西(我假设您的记录在字段中存储了唯一的 ID id):

delimiter |

create event cal_interest 
on every 1 day 
do
    create temporary table if not exists temp_ids(id int) engine=memory;
    declare keep_sync int default 1;
    begin
        repeat
            truncate temp_ids;
            insert into temp_ids(id) select id from userTable where last_sync_date < curdate() limit 500;
            select count(1) from temp_ids into keep_sync;
            update userTable set interest=(money*rate)/100, last_sync_date = curdate() where id in (select id from temp_ids) ids;
        until keep_sync>0;
        drop table temp_ids;
    end |

delimiter ;
于 2014-05-05T08:42:35.480 回答