010-MySQL批量插入测试数据
1、由于测试需要
需要将数据插入到百万级别,故需要使用循环语句,循环参看:009-MySQL循环while、repeat、loop使用
方式三、使用values批量插入【【推荐答案】】
基础格式
INSERT INTO test_table (modelid, modelname, `desc`) VALUES (1, CONCAT('name', 1), 'desc1'), (2, CONCAT('name', 2), 'desc2');
接下来主要是sql语句的拼装,
delimiter // #定义标识符为双斜杠 DROP PROCEDURE IF EXISTS my_procedure ; #如果存在 my_procedure 存储过程则删除 CREATE PROCEDURE my_procedure () #创建无参存储过程 BEGIN DECLARE n INT DEFAULT 1 ; # 申明变量 set @execSql='insert into test_table (modelid,modelname,`desc`) values'; set @execdata = ''; WHILE n <= 10001 DO set @execdata=concat(@execdata,"(",n,",","'name",n,"',","'desc'",")"); if n%1000=0 then set @execSql = concat(@execSql,@execdata,";"); #select @execSql; prepare stmt from @execSql; execute stmt; DEALLOCATE prepare stmt; commit; set @execSql='insert into test_table (modelid,modelname,`desc`) values'; set @execdata = ''; ELSE set @execdata = concat(@execdata,','); end if; SET n = n + 1 ; #循环一次,i加一 END WHILE ; #结束while循环 #select count(*) from test_table; END // delimiter ; call my_procedure(); #调用存储过程 DROP PROCEDURE IF EXISTS my_procedure ; #如果存在 my_procedure 存储过程则删除
调用执行后,查看下执行时间
call my_procedure() OK, Time: 0.18sec
方式一、直接循环单条插入1W条【不推荐】
delimiter // #定义标识符为双斜杠 DROP PROCEDURE IF EXISTS my_procedure ; #如果存在 my_procedure 存储过程则删除 CREATE PROCEDURE my_procedure () #创建无参存储过程 BEGIN DECLARE n INT DEFAULT 1 ; #申明变量 WHILE n <= 10000 DO #结束循环的条件: insert into test_table (modelid,modelname,`desc`) value (n,CONCAT('name',n),'desc'); SET n = n + 1 ; #循环一次,i加一 END WHILE ; #结束while循环 #select count(*) from test_table; END // delimiter ; call my_procedure(); #调用存储过程 DROP PROCEDURE IF EXISTS my_procedure ; #如果存在 my_procedure 存储过程则删除
可以执行成功,但是比较耗时,
call my_procedure() OK, Time: 27.55sec
方式二、每1000天增加一次commit事务提交【不推荐】
delimiter // #定义标识符为双斜杠 DROP PROCEDURE IF EXISTS my_procedure ; #如果存在 my_procedure 存储过程则删除 CREATE PROCEDURE my_procedure () #创建无参存储过程 BEGIN DECLARE n INT DEFAULT 1 ; #申明变量 WHILE n <= 10000 DO #结束循环的条件: insert into test_table (modelid,modelname,`desc`) value (n,CONCAT('name',n),'desc'); SET n = n + 1 ; #循环一次,i加一 if n%1000 =0 THEN COMMIT; end if; END WHILE ; #结束while循环 #select count(*) from test_table; END // delimiter ; call my_procedure(); #调用存储过程 DROP PROCEDURE IF EXISTS my_procedure ; #如果存在 my_procedure 存储过程则删除
可以执行成功,结果是比较耗时
call my_procedure() OK, Time: 27.49sec
结论与上述一致