需要测试千万级别的数据访问性能,于是首先需要有这么多的数据,表中含有开始时间,结束时间,状态,机床编号等信息,要模拟一年的数据,于是设置两条数据之间时间间隔30秒,开始时间和结束时间相差1秒钟,状态交替变化(0、1两个状态)。
假如你用的
InnoDB 模式,如果表中没有外键的话,可以ALTER TABLE test ENGINE = MYISAM; 把存储模式改为
MYISAM ,结束后再改为InnoDB。因为
MYISAM 插入数据的速度比
InnoDB 快好多。有外键的话比较麻烦,这里不再详述。
DELIMITER $$
这句话是把默认的结束符改为$$,默认是分号“;” 而我们下面的函数有好多分号,我们并不想分号执行,于是替换为$$.
SET AUTOCOMMIT = 0$$
这里关闭自动提交
DROP PROCEDURE IF EXISTS t1$$
CREATE PROCEDURE t1()
创建函数
BEGIN
开始
DECLARE i INT DEFAULT 0;
DECLARE j INT DEFAULT 0;
WHILE (i <= 1051200) DO
一年内有1051200个30秒
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,1,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,2,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,3,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,4,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,5,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,6,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,7,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,8,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,9,1);
INSERT INTO `mt_machine_status_computed` (`start`, `end`,`status`,`machine_tool_id`,`shift_id`) VALUES
(DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND),DATE_SUB(NOW(),INTERVAL (1051200-i)*30-1 SECOND),i%2,10,1);
SET i = i + 1;
IF MOD(i,1000)=0 THEN COMMIT;
END IF;
END WHILE;
END;$$
结束
DELIMITER ;
CALL t1();
DATE_SUB(NOW(),INTERVAL (1051200-i)*30 SECOND) 解释: DATE_SUB()是从日期减去指定的时间间隔,单位可以是 YEAR,MONTH,WEEK,DAY,HOUR, MINUTE,SECOND等等。 NOW()是现在的系统时间。