免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2433 | 回复: 10
打印 上一主题 下一主题

[其他] shell 怎么处理mysql的批量更新 [复制链接]

论坛徽章:
2
射手座
日期:2013-10-29 16:22:32丑牛
日期:2013-11-25 16:29:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-24 15:26 |只看该作者 |倒序浏览
本帖最后由 kakaliu 于 2014-01-24 15:27 编辑

  1. #!/bin/bash
  2. dir=/home/kaka/mysqltest
  3. TODAY=$(date -d now)
  4. echo $TODAY
  5. for i in `cat $dir/phone10W`
  6. do
  7. mysql -uroot -p123456 <<EOF
  8.         use kaka;
  9.         #select * from testuser;
  10.         update testuser set birth='2014-01-24 15:00:00' where phone='$i';
  11.         #select * from testuser where phone='$i'
  12. EOF
  13. done
  14. echo "update done!!!"
复制代码
平常经常会用客户端做mysql的批量更新,基本都是通过手机号码作为查询的条件,有时候需要一次性批量更新20-30多万的手机号码某个字段值
但是客户端一次性批量更新 ,顶多一次性到5到6万的样子,如果一次性更新8万的时候 就会提示失败。
如果是20多W以上的号码,我都是每次选择5W一组一组的去更新,感觉手动太累了。
想到用shell,但是for循环这样去做更新 速度效率都太慢了吧!
看看各位大神 有没有什么办法 能写个快捷的shell ,或者python!谢谢!

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2014-01-24 16:15 |只看该作者
一次更新5W你是怎么做的?

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
3 [报告]
发表于 2014-01-24 16:15 |只看该作者
回复 1# kakaliu


    先把所有UPDATE语句生成好,再导入mysql执行,这样会快很多.

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
4 [报告]
发表于 2014-01-24 17:05 |只看该作者
写个程序吧. perl, python 都可以.

论坛徽章:
2
射手座
日期:2013-10-29 16:22:32丑牛
日期:2013-11-25 16:29:17
5
发表于 2014-01-24 17:21
本帖最后由 kakaliu 于 2014-01-24 17:21 编辑
Shell_HAT 发表于 2014-01-24 16:15
一次更新5W你是怎么做的?

比如phone.txt
13812345678
13912345678
.......

然后批量换成13812345678,13912345678,... 这样的格式

然后在客户端执行 update testuser set birth='2014-01-24 15:00:00' where phone in (13812345678,13912345678,...)  

我试过执行10万,客户端执行了一段时间报错,没有一个更新成功,如果是5W以下 一会儿就执行完毕了!

论坛徽章:
2
射手座
日期:2013-10-29 16:22:32丑牛
日期:2013-11-25 16:29:17
6 [报告]
发表于 2014-01-24 17:22 |只看该作者
回复 4# q1208c


    python 咋写
用mysqldb模块的话

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
7 [报告]
发表于 2014-01-24 17:25 |只看该作者
回复 5# kakaliu


你先用split命令把10W行的文件分成5W行的小文件

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2014-01-24 17:27 |只看该作者
本帖最后由 q1208c 于 2014-01-24 17:29 编辑

回复 6# kakaliu

  这得去python版问问.
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
9 [报告]
发表于 2014-02-12 09:56 |只看该作者
用shell,挺折腾的,php多好,php和mysql是绝配啊

论坛徽章:
0
10 [报告]
发表于 2014-02-13 10:29 |只看该作者
楼主用这种方法:mysql -uUSER -pPASS -e "MYSQL COMMAND";
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP