1. 程式人生 > >Mysql批量插入1000w條資料

Mysql批量插入1000w條資料

  • 1 登陸mysql,新建bigData庫
//登入MySQL
[[email protected] ~]# cd /usr/database/mysql5.7/bin
[[email protected] bin]# ./mysql -u root -p
Enter password: 
//SUCCESS
create database bigData;
use bigData;

新建庫

  • 2 新建dept(部門表)
CREATE TABLE dept(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT ""
) ENGINE=INNODB DEFAULT CHARSET=GBK ;

建立dept表

  • 3 新建 emp(員工表)
CREATE TABLE emp(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*編號*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT"",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上級編號*/
hiredate DATE NOT NULL,/*入職時間*/
sal DECIMAL(7 ,2) NOT NULL,/*薪水*/
comm DECIMAL(7 ,2) NOT NULL,/*紅利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部門編號*/
)ENGINE =INNODB DEFAULT CHARSET=GBK ;
  • 4 設定引數 log_bin_trust_function_creators
建立函式,假如報錯: This function has none of DETERMINISTI.....
#由於開啟過慢查詢日誌,因為我們開啟了bin-log, 我們就必須為我們的function指定一個引數。  
show variables like 'log_bin_trust_function_creators';  

set global log_bin_trust_function_creators=1;

#這樣添加了引數以後,如果mysqld重啟,. 上述引數又會消失,
  • 5 建立函式,保證每條資料都不同 隨機產生字串
DELIMITER $$
     CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
     BEGIN
     DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
     DECLARE return_str VARCHAR(255) DEFAULT '';
     DECLARE i INT DEFAULT 0;
     WHILE i<n DO
     SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1)); 
     SET i=i+1;
     END WHILE;
     RETURN return_str;
 END $$
//sql預設每一行的分號結尾,函式程式碼中有很多分號,為了讓程式整體執行,暫時用$$結尾;

隨機產生部門編號

#用於隨機產生部門編號
DELIMITER $$
CREATE FUNCTION rand_num( )
RETURNS INT(5)
BEGIN
 DECLARE i INT DEFAULT 0;
SET i= FLOOR(100+RAND()*10);
RETURN i;
END $$
  • 6 建立儲存過程

建立往emp表中插入資料的儲存過程

DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
	BEGIN
      DECLARE i INT DEFAULT 0;

      ##set autocommit =0 把autocommit設定為0 
      set autocommit = 0;
      REPEAT
      SET i= i+ 1;

      INSERT INTO emp (empno,ename,job,mgr,hiredate ,sal,comm,deptno) 
             VALUES ((START+i),rand_string(6),'SALESMAN',0001 ,CURDATE(),2000,400,rand_num());
      UNTIL i= max_num
END REPEAT;
COMMIT;
END $$

建立往dept表中插入資料的儲存過程

  #執行儲存過程,往dept表新增隨機資料
  DELIMITER $$

  CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))
  BEGIN

  DECLARE i INT DEFAULT 0;
		SET autocommit= 0;
  REPEAT
  SET i=i+1;
  INSERT INTO dept (deptno ,dname,loc ) VALUES ((START+i) ,rand_string(10),rand_string(8));
  UNTIL i= max_num
  END REPEAT;
  COMMIT;
  END $$

6 呼叫儲存過程

//DELIMITER ; 恢復預設;結尾
CALL insert_dept(100,10);

插入10條 執行儲存過程,向emp表中插入50萬條資料,差多了怕機器掛了

CALL insert_emp(100001,500000)

END 2018/10/3-15:16