12.mysql導入大批量數據的方法及優化


1.load方式導入本地數據

 

 

1.環境准備

創建表:

CREATE TABLE `tb_user_2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `password` varchar(96) NOT NULL,
  `name` varchar(45) NOT NULL,
  `birthday` datetime DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `phone` varchar(45) DEFAULT NULL,
  `qq` varchar(32) DEFAULT NULL,
  `status` varchar(32) NOT NULL COMMENT '用戶狀態',
  `create_time` datetime NOT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_user_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
創建表語句

例如我們現在有兩個數據腳本文件(每個文件有1000000條數據):

對應文件下載地址:鏈接:https://pan.baidu.com/s/1RPIuingODnusvi_R_N8YPQ 
提取碼:1111

腳本文件介紹 :
    sql1.log  ----> 主鍵有序
    sql2.log  ----> 主鍵無序

 

 導入數據

那么我們可以在mysql中直接使用下面的命令將上面兩個數據文件的數據導入到我們上面創建的兩個表中:tb_user_1,tb_user_2;

load data local infile '/usr/local/installationPackage/sql1.log' into table `tb_user_1` fields terminated by ',' lines  terminated by '\n';

導入有序主鍵數據:

 

 導入無序主鍵數據:

可見,在導入外部數據的時候我們盡量使用順序主鍵數據;

優化:

2) 關閉唯一性校驗

在導入數據前執行 SET UNIQUE_CHECKS=0,關閉唯一性校驗,在導入結束后執行SET UNIQUE_CHECKS=1,恢復唯一性校驗,可以提高導入的效率。

3) 手動提交事務

如果應用使用自動提交的方式,建議在導入前執行 SET AUTOCOMMIT=0,關閉自動提交,導入結束后再執行 SET AUTOCOMMIT=1,打開自動提交,也可以提高導入的效率。

2.存儲過程批量導入數據

1.環境准備

創建表:

CREATE TABLE `tb_item` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',
  `title` varchar(100) NOT NULL COMMENT '商品標題',
  `price` decimal(20,2) NOT NULL COMMENT '商品價格,單位為:元',
  `num` int(10) NOT NULL COMMENT '庫存數量',
  `categoryid` bigint(10) NOT NULL COMMENT '所屬類目,葉子類目',
  `status` varchar(1) DEFAULT NULL COMMENT '商品狀態,1-正常,2-下架,3-刪除',
  `sellerid` varchar(50) DEFAULT NULL COMMENT '商家ID',
  `createtime` datetime DEFAULT NULL COMMENT '創建時間',
  `updatetime` datetime DEFAULT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';
建表語句

然后我們都知道,我們插入一條數據可以使用:

insert into tb_item values (1,'諾基亞',1999,666,1,'1','OPPO',now(),now());

那么我們把上面語句寫到存儲過程循環執行3000000次,然后調用存儲過程,不就可以插入3000000個數據了嗎?

delimiter $
create procedure insert_data()
begin
declare i int default 1;
while (i<3000000) do
insert into tb_item values (null,concat('諾基亞',i),1999,666+i,1,'1','OPPO',now(),now());
set i=i+1;
end while;
end$
delimiter ;
存儲過程代碼

調用存儲過程之前我們最好執行上面提到的優化操作:

SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM