最近做的游戏,上线后出了不少问题,所以我就经常去查数据库数据,翻各种日志等,但是在查询的时候发现好蛋疼,有些地方的时间是写 "2016-08-11 20:13:02"这种格式,有些地方的时间是写 "1470917582000"这种格式,然后多张表数据进行对比的时候就很蛋疼,我得不停进行时间转换,恶心得不行。最后实在忍不了,我要统一时间格式 (由于时间都是单独一个字段记录,所以比较好处理),两种格式,很明显,对于查数据来说,第一种格式更直观,所以就决定了,将数据库日志类、邮件类的表的 时间,统一成"2016-08-11 20:13:02"这种格式。

想了一下,没法单纯用mysql语句直转换,于是就自己写了一个脚本来转换时间格式(新增的很好处理,主要问题是要将之前记录的数据转换一次,在服务器维护的时候,进行处理)。

一开始想法很简单(很少用mysql,使用的时候也都是简单使用而已),就是把数据库数据全部select出来,然后一条条update,本地测试,没啥 问题。后面就把外网的玩家部分数据导入进来,进行测试。不导不知道,一导吓一跳,内存爆了,哈哈,外网数据量太大,根本就没法让我一下子全select出 来。那咋办呢,想了一下,其实我并不需要那么多数据,对每条记录,我只要select出key和time就行了,说干就干,试了一下,好像不会爆了,但是 发现他的执行速度超级慢,一百万条记录,跑了五六个小时,这还只是部分数据啊,要是是全部数据,那得跑多久啊,停服维护这么久,还不被骂死。没办法,那就 优化吧。

首先想到的是,一条一条更新的速度太慢了,然后就想批量更新,一次更新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的方法,预计得十个小时以 上。虽然几经波折,最后终于放心地交差了。

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

转载自:http://www.cnblogs.com/lingt/p/5762526.html

转载--批量更新数据(性能优化)相关推荐

  1. Mysql 批量写入数据 性能优化

    2019独角兽企业重金招聘Python工程师标准>>> 测试环境 配置直接影响执行速度,先上一下测试机配置: cpu i7 5500U(低电压伤不起,以后再也不买低电压的U了) 内存 ...

  2. Mybatis批量更新数据

    Mybatis批量更新数据 第一种方式 [html] view plaincopy print? <update id="updateBatch" parameterType ...

  3. 批量更新数据(BatchUpdate)

    批量更新数据(BatchUpdate) /// <summary> /// 批量更新数据,注意:如果有timestamp列,要移除 /// </summary> /// < ...

  4. FreeSql (十四)批量更新数据

    FreeSql支持丰富的更新数据方法,支持单条或批量更新,在特定的数据库执行还可以返回更新后的记录值. var connstr = "Data Source=127.0.0.1;Port=3 ...

  5. Pgsql批量更新数据

    Pgsql批量更新数据 参照:https://www.cnblogs.com/ldj3/p/9288187.html 一般方式:性能较差 <update id="updateData& ...

  6. tp5 批量更新多条记录_Thinkphp怎么批量更新数据

    展开全部 ||thinkphp批量更新数据可以参考如下三种方法: 方法一: //批量修改 data二维数组 field关键字段62616964757a686964616fe59b9ee7ad94313 ...

  7. springboot批量更新实体_mybatis+mysql+springboot批量插入,批量更新数据

    在开发过程中都会遇到批量的插入或者是更新数据,本人只写了一下自己在做的过程中遇到问题,写此篇文章的作用:第一是记录自己在工作过程中的问题.第二是方便同行的伙伴们避免出现这样的问题消耗太多的时间.废话不 ...

  8. SqlServer 利用游标批量更新数据

    SqlServer 利用游标批量更新数据 Intro 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了 Sample 下面来看 ...

  9. php怎么更新多条数据,PHP中批量更新数据表中多条记录

    class test { /** * 创建像这样的查询: "IN('a','b')"; * * @author wengxianhu * @created to 2013-05-2 ...

最新文章

  1. Java的I/O笔记(3)
  2. php中的意外type字符串,关于php:解析错误:语法错误,意外’文本’(T_STRING),期待’,’或’;’...
  3. C#中读取“已注册的文件类型”的图标及读取指定文件图标的方法 (转)
  4. uboot主循环main_loop
  5. cts(7)---android 8.1 vts环境和测试
  6. oracle数据库怎么保存表,oracle从各个表取得数据保存到另一个表
  7. ddk开发 c语言,使用DDK提供的build进行编译驱动一点总结
  8. BaseHTTPRequestHandler,HTTPServer
  9. 移动端H5及微信公众号实现人脸识别的可行性demo
  10. 【领英如何一键批量有效地加好友?】
  11. java使用ffmpeg实现视频切割
  12. fla文件中切记不能使用TLF文本
  13. VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image)
  14. C++实现多态的条件
  15. vue3学习—state的变化和使用
  16. RecyclerView EditText 数据错乱问题
  17. 移动app——“免费”才是王道
  18. HA_ProxyCap_v302
  19. Windows 10下打印机不能打印Office文件解决办法
  20. 文件粘滞位(粘着位)的作用

热门文章

  1. mysql public权限_MySQL · 引擎特性 · Binlog encryption 浅析
  2. EasyUI -- Layout(布局)
  3. 大学生计算机大赛课题,第14届中国大学生计算机设计大赛云南赛区决赛举行 32个项目胜出...
  4. join丢失数据_15、Hive数据倾斜与解决方案
  5. tomcat实现https双向认证(在win10系统使用jdk1.8自带工具keytool)
  6. shiro-cas------自定义登录页面
  7. java完整JDBC操作数据库
  8. plc仿真实训软件_欧倍尔新品:现代电气控制和自动生产线装调两款虚拟仿真实训软件...
  9. 横坐标设置_默认设置解决不了?!三种办法来解决,保住了Excel的“面子”
  10. 人脸检测(十七)--Faceness-Net