Mysql 只通过sql语句把三天的数据分布到一年中去

最近在做软件的压力测试,客户要求的是每5分钟存一次数据库,压力测试做到每6秒存一次数据。

压力测试完成后,正好碰上要给客户演示,压力测试三天存储的300W的数据要分布到一年中去,因为客户要求的功能包含月报表年报表,三天的数据肯定不能满足这两个功能的要求。

介绍一下这300W条数据是怎么来的,组态软件中共有107个变量,每6秒钟存一次变量的值,变量名,存储时间等。并且这300W条数据有些数据是无规律自增的,有些数据是无规律变化的,那么我们肯定不能把这300W数据随机分布到一年中去,肯定要找到一个规律。

那么我们找到的规律是:每107个变量存储时间是相同的,那么我们对变量进行按时间升序排序,加一个rownum字段,这个字段的意义是每一个数据按时间排序后的序号,然后通过rownum对这些数据进行分布。


  • 在Mysql中根据升序排序加rownum字段
set @mycnt = 0;UPDATE `表名` SET rownum= (@mycnt := @mycnt + 1)  ORDER BY 按字段升序排序 ASC;

set @mycnt = 0;UPDATE `test1` SET rownum= (@mycnt := @mycnt + 1)  ORDER BY date_time ASC;

 

  • 有了rownum问题就好处理了,我们按照每1个小时存107条数据(原来是每6秒存一次)的原则对数据的时间字段进行修改
delimiter // 
drop procedure if exists proinitData; 
create procedure proinitData()
begin
  declare initDate datetime;
  declare mycnt int;
  declare addHour int;
  set initDate = '2018-09-01 00:00:01';
  set mycnt = 0;
  set addHour = 0;
  while mycnt <= '776160' do
     update data_gather_float SET gather_time = DATE_ADD(initDate,INTERVAL addHour HOUR) where rownum = mycnt ORDER BY rownum ASC;
     set addHour = mycnt div 107;
     set mycnt = mycnt +1;
  end while;
end
//
call proinitData(); 

月报表年报表的数据一共77W条,默认第一条数据是2018年9月1日,到107条数据就加一个小时。这个时间的增加Mysql有函数DATE_ADD,很方便,加秒加小时加天都是自动加上去的。

这样就大功告成啦。


这个方法的问题在于进行UPDATE操作太耗时间,6个小时才能UPDATE完77W条数据,如果有更快的方法可以在底下评论留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章