mysql批量更新数据(性能优化) 第一种方式
首先想到的是,一条一条更新的速度太慢了,然后就想批量更新,一次更新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的方式,不然会没有把旧表的索引复制过来
最新文章
- CSS表格溢出省略号代替及其他标签
- lua 类支持属性不能被修改
- js跨域访问,No 'Access-Control-Allow-Origin' header is present on the requested resource
- 通过命令行连接Wifi
- Qlikview 的服务器
- iOS开发之正则表达式
- POJ 3617 Best Cow Line (贪心)
- .NET中开源CMS目录
- javascript的框架演化
- Manacher详解
- Java基于自定义注解的面向切面的实现
- Oracle监听已经启动了 sqlplus / as sysdba 仍然报 ERROR:ORA-12560
- LuoGu P1352 没有上司的舞会
- socket-WebSocket-HttpListener-TcpListener服务端客户端的具体使用案例
- 使用vuejs做一个todolist
- 基于开源SuperSocket实现客户端和服务端通信项目实战
- OpenGL ES 3.0 图元组合和光栅化(三)
- 【Win7 x64】+【annaconda3】+ 【python3.5.2】+【tensorflow-gpu】 [最终配置 gtx 940mx + Cuda8.0+cudnn v5.1 + tensorflow-gpu1.0.0 ]
- Mirror--镜像相关错误
- 【BZOJ】1468: Tree(POJ1741) 点分治