通过存储过程批量创建数据

利用存储过程创建数据。

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.//等间隔给时间赋值

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注