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

 

结论与上述一致

 

posted @ 2019-11-28 13:40  bjlhx15  阅读(808)  评论(0编辑  收藏  举报
Copyright ©2011~2020 JD-李宏旭