插入千萬級別的Mysql數據
需要測試千萬級別的數據訪問性能,於是首先需要有這麼多的數據,表中含有開始時間,結束時間,狀態,機牀編號等信息,要模擬一年的數據,於是設置兩條數據之間時間間隔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()是現在的系統時間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.