我想计算 mysql 中数百万条记录的利息。所以我正在使用调度程序
create event cal_interest
on every 1 day
do
update
userTable
set interest=(money*rate)/100
我的问题是:
1. 是否有可能同时更新数百万条记录?
2.任何可能的一些记录更新和一些失败。
3. 如果计算多条记录的利息方法错误,请建议我怎么做?
我想计算 mysql 中数百万条记录的利息。所以我正在使用调度程序
create event cal_interest
on every 1 day
do
update
userTable
set interest=(money*rate)/100
我的问题是:
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 ;