通过存储过程批量创建数据
利用存储过程创建数据。
1.预备知识
1.1 mysql常用函数
abs();
#keyword could be :MINUTE,MINUTE_SECOND.
date_add(date,interval int keyword);
date_sub(date,interval int keyword);
#get hour of the time,(1,23)
hour(time);
#transform time format to second,which elapes
from 1970-01-01 00:00:00 to now.
time_to_sec(time)
2.表结构
2.1 总览数据表结构
CREATE TABLE randtime
(id
INT(11) NOT NULL AUTO_INCREMENT,create_time
DATETIME NULL DEFAULT NULL,area
VARCHAR(255) NULL DEFAULT NULL COMMENT ‘地区’ COLLATE ‘utf8_general_ci’,network
BIGINT(20) NULL DEFAULT NULL COMMENT ‘总流量mb’,lonline_num
BIGINT(20) NULL DEFAULT NULL COMMENT ‘在线人数’,backsource_network
BIGINT(20) NULL DEFAULT NULL COMMENT ‘回源流量mb’,backsource_rate
BIGINT(20) NULL DEFAULT NULL COMMENT ‘回源比’,type
VARCHAR(255) NULL DEFAULT NULL COMMENT ‘live直播,vod点播’ COLLATE ‘utf8_general_ci’,diapach_num
BIGINT(20) NULL DEFAULT NULL COMMENT ‘调度量’,
PRIMARY KEY (id
) USING BTREE
)
COMMENT=’创建随机时间的表’
COLLATE=’latin1_swedish_ci’
ENGINE=InnoDB
AUTO_INCREMENT=31
;
2.2 设备数据表结构
CREATE TABLE device_status
(id
BIGINT(20) NOT NULL AUTO_INCREMENT,device_ip
VARCHAR(255) NULL DEFAULT NULL COLLATE ‘utf8_general_ci’,area
VARCHAR(255) NULL DEFAULT NULL COMMENT ‘所属地区’ COLLATE ‘utf8_general_ci’,cpu
BIGINT(20) NULL DEFAULT NULL COMMENT ‘百分比’,memory
BIGINT(20) NULL DEFAULT NULL COMMENT ‘内存百分比’,disk
BIGINT(20) NULL DEFAULT NULL,network
BIGINT(20) NULL DEFAULT NULL,status
BIGINT(20) NULL DEFAULT NULL COMMENT ‘0,正常,1异常’,create_time
DATETIME NULL DEFAULT NULL,
PRIMARY KEY (id
) USING BTREE
)
COMMENT=’设备硬件状态’
COLLATE=’utf8_general_ci’
ENGINE=InnoDB
;
2.3 总览数据表存储过程
BEGIN
DECLARE v_t DATETIME ;
DECLARE time_factory DOUBLE(6,3) DEFAULT 1;
DECLARE areacode varchar(255) DEFAULT NULL;
DECLARE pronet BIGINT(20) DEFAULT NULL ;
DECLARE bandwidth BIGINT(20) DEFAULT NULL;
DECLARE debug DOUBLE(6,3) DEFAULT NULL;
DECLARE clients BIGINT(20) DEFAULT 0 ;
DECLARE upstream BIGINT(20) DEFAULT 0 ;
DECLARE rate DOUBLE(6,3) DEFAULT 1;
#时间范围6-12到7-12之间
SET areacode = 'suzhou';
#并发总带宽
SET bandwidth = 674000 ;
SET v_t = FROM_UNIXTIME(UNIX_TIMESTAMP('2022-06-12') + FLOOR(RAND()*(UNIX_TIMESTAMP('2022-07-12')-UNIX_TIMESTAMP('2022-06-12')+1)));
#SELECT v_t;
#SELECT HOUR(v_t);
#time_factory影响因子
IF abs(HOUR(v_t) - 21) <= 2 THEN
#造峰。晚高峰段19-23,顶点21,影响因子(3,4,5,4,3)
SET time_factory = 5 - ABS(HOUR(v_t)-21);
ELSEIF ABS(HOUR(v_t) - 12) <= 1 THEN
#造峰。午高峰段11-13,顶点12,影响因子(2,3,2)
SET time_factory = 3 - ABS(HOUR(v_t)-12);
ELSEIF ABS(HOUR(v_t) - 3) <= 2 THEN
#造谷。谷段1-5,最低点3,影响因子(0.75,0.5,0.25,0.5,0.75)
SET time_factory =(ABS(HOUR(v_t)-3)+1)/4;
END if;
#随机偏移(-0.05,0.05)
SET debug = RAND()*0.02-0.01;
#最高0.55
SET time_factory = time_factory/10 + debug;
#总流量
SET pronet = bandwidth * time_factory;
SET clients = pronet / 8;
#SELECT time_factory,bandwidth,debug,pronet,clients;
SET rate = RAND()*0.1 + 0.1;
#设置回源流量
SET upstream = pronet * rate;
INSERT INTO randtime(create_time, area, network, lonline_num, backsource_network, backsource_rate)
VALUES(v_t, areacode, pronet, clients, upstream,rate);
#SELECT v_t, areacode, pronet, clients, upstream,rate;
END
2.4 总体思路
数据量随时间变化的趋势明显,所以考虑做两个波峰(午高峰和晚高峰),一个波谷,同时加了随机偏移,这样数据更逼真。
因为数据波峰和波谷都选用最简单的绝对值造,用abs()函数,左右偏移,总流量乘以时间因子(0.015,0.55),具体细节代码的注释已经很清楚了,不再细说;因为mysql没有现成的range()函数可以对范围取值,所以用rand*()函数替代,rand()*(max-min)+min即可。
只要有了总流量,回源率、在线设备数、回源流量等都可以得出。
3. 总结
1.创建表时float类型可以附带精度,如float(6,3)代表一共六位,三位用来表示小数,即精度0.001。
2.floor等函数用于整数,向上取整,别忽略了。
3.波峰、波谷函数注意上下界。
4.//TODO.存储过程中时间大小的比较。
5.//等间隔给时间赋值