最近发生产执行SQL的时候,更新一张几十万的大表出现了如下所示错误,
大致意思就是在执行这个事务的时候由于内存不足导致更新失败,这是可以有两种办法,一是可以把内存调大,但是生产的参数随意改动风险大,第二种方法是分次进行一个更新,这就也可以解决问题。
1.使用update 和limit 以及order by语句
- 先统计这张表的大致数量
select count(*) from student;
- 拿到记录数后大致可以试一下找到一个切分的值
- 先更新第一部分,假设更新一万条
UPDATE student SET name= '张三' order by id limit 10000,
- 当想再次更新10001到20000条的时候报错了,此时可以直接使用子查询进行更新
UPDATE student SET name = '张三' where id in (
select id from (select id from student order by id limit 10001,20000) as temp );
- 注意更新最好更加某个字段进行排序可以确保语句的正确性