首先想到的是,一条一条更新的速度太慢了,然后就想批量更新,一次更新N条数据。实践是检验真理的唯一标准,不一会儿,代码就敲完了,重新试了一下,效果依旧不理想。啊哦,真是要崩溃!后面又想到了利用异步,我一下子开多个mysql连接,同时处理,可是依旧慢的一笔。然后就放弃了,更新的效率肯定是满足不了了。然后就想着绕弯子了,我新建一张表,把旧表数据取出来,处理完后,直接插入到新表,然后再把旧表删除,把新表重新命名成旧表的名字。想想,insert into的速度应该会比update快不少。但是要把旧表数据全部取出来,内存会爆掉,所以我就用慢慢取的方式, select+limit。试了一下,速度快了不少,但是感觉也得跑个一个多小时。虽然快了很多,但是这速度肯定还是不行。

然后试了下,select的时候用select + where + order by + limit的方法,where和order by都是用time去处理,跑了一下,十来分钟就搞定了。后面想想,where和order by的时候用表的主键去处理,应该会快点,然后就试了一下,哇塞,效果很明显,select + where + order by + limit的方法(用主键去处理where 和order by) ,一分钟就处理完了所有数据。取一次数据,处理完数据后,插入一次数据,可以根据自己的数据量大小,适当调整一次要select多少条数据出来。记住,select出来后,处理完,一次性插入新表,不要一条条插入!

最终结果,用select + where + order by + limit的方法(用主键去处理where 和order by) ,一分钟左右就处理完了五百万条左右的数据,有好几张表,其中有两张表都各有一两百万条的数据,而最初的那种逐条update的方法,预计得十个小时以上。虽然几经波折,最后终于放心地交差了。

 重点:普通的select方式取出来速度很慢,插入新表的方案,性能的关键点在于从旧表select出数据,至于插入,只要使用批量插入就好啦!

小插曲: 创建新表的时候,我是用复制旧表结构的方式去创建的,复制旧表结构的时候,记得使用create table newTableName like oldTableName的方式,不然会没有把旧表的索引复制过来

最新文章

  1. CSS表格溢出省略号代替及其他标签
  2. lua 类支持属性不能被修改
  3. js跨域访问,No 'Access-Control-Allow-Origin' header is present on the requested resource
  4. 通过命令行连接Wifi
  5. Qlikview 的服务器
  6. iOS开发之正则表达式
  7. POJ 3617 Best Cow Line (贪心)
  8. .NET中开源CMS目录
  9. javascript的框架演化
  10. Manacher详解
  11. Java基于自定义注解的面向切面的实现
  12. Oracle监听已经启动了 sqlplus / as sysdba 仍然报 ERROR:ORA-12560
  13. LuoGu P1352 没有上司的舞会
  14. socket-WebSocket-HttpListener-TcpListener服务端客户端的具体使用案例
  15. 使用vuejs做一个todolist
  16. 基于开源SuperSocket实现客户端和服务端通信项目实战
  17. OpenGL ES 3.0 图元组合和光栅化(三)
  18. 【Win7 x64】+【annaconda3】+ 【python3.5.2】+【tensorflow-gpu】 [最终配置 gtx 940mx + Cuda8.0+cudnn v5.1 + tensorflow-gpu1.0.0 ]
  19. Mirror--镜像相关错误
  20. 【BZOJ】1468: Tree(POJ1741) 点分治

热门文章

  1. DB2 catalog 编目
  2. 远程连接docker
  3. 初始HTML_表格
  4. js文件中模块化导入swiper.js文件方法
  5. Mysql 索引精讲
  6. 软工个人项目(Java实现)
  7. 究竟是什么毁了我的impl实现
  8. BayaiM__linux双网卡绑定文档
  9. Python—时间模块(time)和随机模块(random)
  10. web-never give up