需求
现在有一个 数据量 为100万的数据样本 100w_data.sql
其数据格式如下,截取最后十条数据
999991,XxGdnLZObA999991,XxGdnLZObA,XxGdnLZObA,2020-3-18,1
999992,TBBchSKobC999992,TBBchSKobC,TBBchSKobC,2020-9-8,2
999993,rfwgLkYhUz999993,rfwgLkYhUz,rfwgLkYhUz,2020-2-6,0
999994,GQZXukHouW999994,GQZXukHouW,GQZXukHouW,2020-9-16,1
999995,UMNjgaXtnO999995,UMNjgaXtnO,UMNjgaXtnO,2020-3-18,2
999996,WFvQNUotHQ999996,WFvQNUotHQ,WFvQNUotHQ,2020-8-13,0
999997,FrmLUUEXWf999997,FrmLUUEXWf,FrmLUUEXWf,2020-10-4,1
999998,LWVyHCGiij999998,LWVyHCGiij,LWVyHCGiij,2020-4-14,2
999999,TTXdvcnCpL999999,TTXdvcnCpL,TTXdvcnCpL,2020-5-3,0
1000000,sjCFoeKCks1000000,sjCFoeKCks,sjCFoeKCks,2020-6-26,1
我们需要将这100万条插入如下表中
CREATE TABLE `tb_user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`birthday` DATE DEFAULT NULL,
`sex` CHAR(1) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_user_username` (`username`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ;
实现
- 客户端连接服务端时,加上参数 --local-infile
mysql --local-infile -u root -p
- 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
可以通过 select @@local_infile;
查看开关是否开启,为0没开启,为1开启
-
切换到自己的数据库下,并根据上面的建表语句创建 tb_user 数据表
-
执行load指令将准备好的数据,加载到表结构中,这里要100w_data.sql数据样本放到 /root 目录下
load data local infile '/root/100w_data.sql' into table tb_user fields terminated by ',' lines terminated by '\n' ;
解释上面的sql语句 – 先指定文件所在位置 ‘/root/100w_data.sql’ ,再指定要插入的数据表 tb_user ,fields terminated by ','
是指每个字段之间根据 逗号 进行分隔,lines terminated by ‘\n’ 表示每行数据根据 换行 进行分隔,这要根据具体的数据样本格式各改变
结果
看到成功插入100万条数据,而且耗时 13.10 秒,如果 使用批量 insert ,耗时需要达到 10 分钟
因此如果是大批量数据插入,需要使用 load 而不是 insert