首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 分段批量update

基础概念

MySQL 分段批量更新是指将大量的更新操作分成多个较小的批次进行执行,以减少对数据库的负担和提高性能。这种技术通常用于处理大量数据更新的场景,例如数据清洗、数据同步等。

优势

  1. 减少锁竞争:分段批量更新可以减少对表的锁定时间,从而降低锁竞争的概率。
  2. 提高性能:通过减少单次更新的数据量,可以提高更新操作的效率。
  3. 降低风险:如果更新过程中出现问题,可以更容易地回滚到之前的状态。

类型

  1. 基于行号的批量更新:根据行号范围进行批量更新。
  2. 基于条件的批量更新:根据特定条件进行批量更新。
  3. 基于游标的批量更新:使用游标逐行处理数据并更新。

应用场景

  1. 数据清洗:对大量数据进行格式化、去重等操作。
  2. 数据同步:将数据从一个表同步到另一个表。
  3. 数据归档:将旧数据归档到历史表中。

示例代码

以下是一个基于行号的批量更新的示例代码:

代码语言:txt
复制
-- 创建示例表
CREATE TABLE example_table (
    id INT PRIMARY KEY,
    value VARCHAR(255)
);

-- 插入示例数据
INSERT INTO example_table (id, value) VALUES
(1, 'old_value1'),
(2, 'old_value2'),
(3, 'old_value3'),
(4, 'old_value4'),
(5, 'old_value5');

-- 分段批量更新
SET @batch_size = 2;
SET @start_id = 1;

WHILE @start_id <= (SELECT MAX(id) FROM example_table) DO
    UPDATE example_table
    SET value = CONCAT('new_', value)
    WHERE id BETWEEN @start_id AND (@start_id + @batch_size - 1);
    
    SET @start_id = @start_id + @batch_size;
END WHILE;

遇到的问题及解决方法

问题:更新过程中出现死锁

原因:多个并发更新操作可能导致死锁。

解决方法

  1. 调整事务隔离级别:降低事务隔离级别,减少锁的持有时间。
  2. 优化更新顺序:确保所有更新操作按相同的顺序访问数据。
代码语言:txt
复制
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

问题:更新速度过慢

原因:单次更新的数据量过大,导致性能下降。

解决方法

  1. 增加批次大小:适当增加每个批次的大小,减少循环次数。
  2. 优化索引:确保更新操作涉及的列上有合适的索引。
代码语言:txt
复制
SET @batch_size = 5;

参考链接

通过以上方法,可以有效地进行 MySQL 分段批量更新,提高数据库操作的效率和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • MySql数据库Update批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value...'; 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values...一条记录update一次,这样性能很差,也很容易造成阻塞。 那么能不能一条sql语句实现批量更新呢?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。...WHEN 3 THEN 'value' END WHERE id IN (1,2,3) 这里使用了case when 这个小技巧来实现批量更新。...代码也很容易理解,你学会了吗 性能分析 当我使用上万条记录利用mysql批量更新,发现使用最原始的批量update发现性能很差,将网上看到的总结一下一共有以下三种办法: 1.批量update,一条记录update

    21.6K31

    这才是批量update的正确姿势!

    此外,MySQL默认也是关闭批量更新数据的,不过我们可以在jdbc的url要上,添加字符串参数:&allowMultiQueries=true,开启批量更新操作。...url: jdbc:mysql://localhost:3306/console?...5 最后 本文由一位球友的问题开始,讨论了批量更新的四种常见方式: for循环中一条条更新 foreach拼接update语句后批量更新。 使用case when的方式做判断。...使用insert into on duplicate key update语法,批量插入或者批量更新。 虽说有很多种方式,但我个人认为批量update的最佳方式是第2种方式。...此外,如果大家遇到执行批量update操作,不支持批量更新问题时: sql injection violation, multi-statement not allow 首先要在数据库连接的url后面增加

    8610

    MySQL insert or update sql

    MySQL 一条 sql 实现数据保存变更 insert or update ,如果没有执行insert,有就update 需要 有主键 PRIMARY 或 唯一索引 UNIQUE MySQL...中的INSERT … ON DUPLICATE KEY UPDATE语句,该语句是基于唯一索引或主键使用 ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。...使用ON DUPLICATE KEY UPDATE,最终如果插入了一个新行,则受影响的行数是1,如果修改了已存在的一行数据,则受影响的行数是2,如果值不变,则受影响行数是0。...INSERT… ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe 翻译:使用BINLOG_FORMAT...插入……对于具有多个唯一密钥的表的重复密钥更新是不安全的 相关博客:https://blog.csdn.net/rick_zyl/article/details/79024612 mysql 有就更新

    2.7K20

    MySQL的SELECT …for update

    最近的项目中,因为涉及到Mysql数据中乐观锁和悲观锁的使用,所以结合项目和网上的知识点对乐观锁和悲观锁的知识进行总结。...要使用悲观锁,我们必须关闭mysql数据库的自动提交属性。 set autocommit=0;   //设置完autocommit后,我们就可以执行我们的正常业务了。...补充:MySQL select…for update的Row Lock与Table Lock   上面我们提到,使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL...InnoDB默认Row-Level Lock,所以只有「明确」地指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住...select * from person where id>=2 for UPDATE   以上就是关于数据库主键对MySQL锁级别的影响实例,需要注意的是,除了主键外,使用索引也会影响数据库的锁定级别

    3.8K30

    Java批量更新太慢?多线程+List分段完美解决!

    写在前面 相信不少开发者在遇到项目对数据进行批量操作的时候,都会有不少的烦恼,尤其是针对数据量极大的情况下,效率问题就直接提上了菜板。...因此,开多线程来执行批量任务是十分重要的一种批量操作思路,其实这种思路实现起来也十分简单,就拿批量更新的操作举例。...整体流程图如下: 步骤 步骤如下: 获取需要进行批量更新的大集合 A,对大集合进行拆分操作,分成 N 个小集合 A-1 ~ A-N 。...开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作。 对流程进行控制,控制线程执行顺序。...记录单个任务的执行次数 CountDownLatch countDownLatch = new CountDownLatch(splitNList.size()); // 对拆分的集合进行批量处理

    96641

    Java批量更新太慢?多线程+List分段完美解决!

    目录 写在前面 步骤 写在最后 写在前面 相信不少开发者在遇到项目对数据进行批量操作的时候,都会有不少的烦恼,尤其是针对数据量极大的情况下,效率问题就直接提上了菜板。...因此,开多线程来执行批量任务是十分重要的一种批量操作思路,其实这种思路实现起来也十分简单,就拿批量更新的操作举例。...整体流程图如下: 步骤 步骤如下: 获取需要进行批量更新的大集合 A,对大集合进行拆分操作,分成 N 个小集合 A-1 ~ A-N 。...开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作。 对流程进行控制,控制线程执行顺序。...记录单个任务的执行次数 CountDownLatch countDownLatch = new CountDownLatch(splitNList.size()); // 对拆分的集合进行批量处理

    1.8K30

    MySQL 案例:Update 死锁详解

    死锁的两个语句如下: UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6247476)...AND (id2 = 74354) UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 =...MySQL 的锁机制天然具备这个条件。 请求与保持条件:资源请求被阻塞时,已持有的资源不会被释放。 MySQL 不触发死锁回滚,且未进入 lockwait_timeout 的时候,具备这个条件。...MySQL 的锁机制天然具备这个条件。 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系,通常会表现为有向环。...由于 MySQL 的锁机制的原因,只需要判断出两个 SQL 语句的锁存在循环等待,那么死锁的条件就会成立了。

    15.2K174
    领券