gpt4 book ai didi

mysql - mysql中如何更新多条记录

转载 作者:行者123 更新时间:2023-11-29 01:57:52 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

评论:我所说的“分表”不是指物理上的分表,而是指:

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

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

    • 使用 last_sync_date

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

    • 否则,为具有这些 ID 的记录设置 interest=(money*rate)/100, last_sync_date = curdate()

    我宁愿把它作为一个在 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 ;

关于mysql - mysql中如何更新多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23468104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com