1. 程式人生 > 實用技巧 >12.mysql匯入大批量資料的方法及優化

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;