• 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

    结论与上述一致

  • 相关阅读:
    KKT条件原理
    拉格朗日乘子法
    Java volatile详解
    Java重排序
    Java Socket NIO入门
    Java Socket入门
    TCP三次握手,四次挥手
    Java NIO详解
    cobbler批量安装系统
    nginx详解反向代理,负载均衡,LNMP架构上线动态网站
  • 原文地址:https://www.cnblogs.com/bjlhx/p/11949479.html
Copyright © 2020-2023  润新知