插入千萬級別的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()是現在的系統時間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章