MySQL千万级数据量表update问题

zgftdr 2018-07-03 08:59:03
MySQL大表update怎么做?
比如,我有一个t1表,想更新c1字段,就是一个update t1 set c1=1;
但是t1表有1600万行。
如何做才能更快?!
...全文
3745 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
克厃制 2019-11-08
  • 打赏
  • 举报
回复
引用 16 楼 AHUA1001 的回复:
不能用LIMIT,因为每次LIMIT的数据,可能有重复的,而且也不能保证所有的数据,都能LIMIT到。

注意七楼的查询条件!! where c1!=1 查询的是未修改过的数据
qq_41265012 2019-03-26
  • 打赏
  • 举报
回复
如果只有一次,那就手动分批
AHUA1001 2019-03-25
  • 打赏
  • 举报
回复
不能用LIMIT,因为每次LIMIT的数据,可能有重复的,而且也不能保证所有的数据,都能LIMIT到。
sgyiliya 2019-03-25
  • 打赏
  • 举报
回复
学习了。谢谢。
AHUA1001 2019-03-22
  • 打赏
  • 举报
回复
在这个表里,找一个带索引的字段,这个带索引的字段要具备以下要求。
1、这个要求比如要满足。字段的值,可以穷举。比如某字段存的是学历,只能有小学、中学、大学。或者是日期也可以,但是要确定日期的最早和最晚值。
2、这个要求最好满足,就是值分别均匀,比如学历,小学、中学、大学的数据量,相差不是特别大。
3、这个要求最好满足,这个值能分配的分数最好多一些,能有份10份的数据,不要分5份的。

最后的语句
UPDATE t1 SET c1 = 1 WHERE 字段 = 值1 ;
UPDATE t1 SET c1 = 1 WHERE 字段 = 值2 ;
UPDATE t1 SET c1 = 1 WHERE 字段 = 值2 ;
……
zgftdr 2019-03-22
  • 打赏
  • 举报
回复
引用 13 楼 zgftdr 的回复:
去年水平太菜,当然现在也不强。7楼的方法就不错。 可以用存储过程,可以用脚本 #!/bin/bash a=0 while [ $a -le 最大值 ] do mysql test << EOF update table set user='xxxx' where id > $a and id <= $a+2000; select sleep(0.5); EOF let a=a+2000 done
用7楼的方法可以在没有主键的情况下也能update
zgftdr 2019-03-22
  • 打赏
  • 举报
回复
去年水平太菜,当然现在也不强。7楼的方法就不错。 可以用存储过程,可以用脚本 #!/bin/bash a=0 while [ $a -le 最大值 ] do mysql test << EOF update table set user='xxxx' where id > $a and id <= $a+2000; select sleep(0.5); EOF let a=a+2000 done
  • 打赏
  • 举报
回复
楼主有用存储过程解决吗?
AHUA1001 2018-07-13
  • 打赏
  • 举报
回复
如果没有条件,可以试试这个,不知道c1是什么类型的,暂且认为是VARCHAR(10),如果不是,请修改一下。 ALTER TABLE t1 DROP COLUMN c1, ADD COLUMN c1 VARCHAR(10) DEFAULT '1' NULL FIRST; ALTER TABLE t1 CHANGE c1 c1 VARCHAR(10) CHARSET utf8 COLLATE utf8_general_ci NULL;
luyaran 2018-07-09
  • 打赏
  • 举报
回复
引用
通过存储过程分组提交,有一个自增主键id列
CREATE PROCEDURE `update_t1`()
BEGIN
declare i int;
set i = 0;
while i <= 27422755 DO
update t1 set c1=1 where id>=i and id < i+10000;
commit;
set i = i+10000;
end while;
end

这个好
zgftdr 2018-07-05
  • 打赏
  • 举报
回复
通过存储过程分组提交,有一个自增主键id列
CREATE PROCEDURE `update_t1`()
BEGIN
declare i int;
set i = 0;
while i <= 27422755 DO
update t1 set c1=1 where id>=i and id < i+10000;
commit;
set i = i+10000;
end while;
end
Rotel-刘志东 2018-07-04
  • 打赏
  • 举报
回复
只能批量更新。
zjcxc 2018-07-04
  • 打赏
  • 举报
回复
参考类似这样的存储过程
delimiter $$
create procedure p()
begin
set @f=0, @r=0;
prepare st from 'update t2 a, (select id from t2 limit ?,5000) b set a._id=a.id where a.id=b.id';
w:while true do
execute st using @f;
select @f+found_rows(), found_rows() into @f, @r;
if @r < 5000 then leave w; end if;
end while;
deallocate prepare st;
end$$
delimiter ;
call p;
ACMAIN_CHM 2018-07-04
  • 打赏
  • 举报
回复
update t1 set c1=1 where c1 != 1 limit 1000
zgftdr 2018-07-04
  • 打赏
  • 举报
回复
引用 1 楼 kxjrzyk 的回复:
写一个存储过程用循环,一次更新2000行,如果一次性更新肯定卡死

其实我就是不会写这个存储过程。。
update tt set user='abc' ,mobile='123456789' where id<14000000 and id>12999999;
我现在在100万100万的手动执行,一次3分钟,表里有个id的主键列,更新的字段,user和mobile都有索引
zgftdr 2018-07-04
  • 打赏
  • 举报
回复
其实我就是不会写这个存储过程。。
update tt set user='abc' ,mobile='123456789' where id<14000000 and id>12999999;
我现在在100万100万的手动执行,一次3分钟,表里有个id的主键列,更新的字段,user和mobile都有索引
  • 打赏
  • 举报
回复
用你那种按主键分批次更新 挺好
生命沉思者 2018-07-04
  • 打赏
  • 举报
回复
写一个存储过程用循环,一次更新2000行,如果一次性更新肯定卡死

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧