【问题标题】:How to update multiple records in mysql如何更新mysql中的多条记录
【发布时间】:2014-06-21 11:55:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql sql sql-update scheduler mysql-event


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

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

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

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

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

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

      • 使用 last_sync_date

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

      • 否则,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 ;
    

    【讨论】:

    • 感谢您的回复....但是如何将表格拆分为批次并在调度程序中应用操作....
    • 查看更新的答案,了解将其编码为事件的示例,但根据您熟悉的编程语言,我宁愿用该编程语言编写相同的作业并通过 cron 安排它.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2018-07-17
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多