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條數據,如果有更快的方法可以在底下評論留言

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