zoukankan      html  css  js  c++  java
  • 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

    结论与上述一致

  • 相关阅读:
    Spring Boot实现发送邮件
    IDEA thymeleaf ${xxx.xxx}表达式报错,红色波浪线
    解决springboot——集成 mybatis遇到的问题:No MyBatis mapper was found in '[com.example.demo]' package...
    解决Intellij IDEA中Mybatis Mapper自动注入警告
    System.gc()和Runtime.gc()的区别
    Java中定时器相关实现的介绍与对比之:Timer和TimerTask
    markdown语法介绍
    Java VisualVM使用
    Linux系统负载查询
    Kafka高性能吞吐关键技术分析
  • 原文地址:https://www.cnblogs.com/bjlhx/p/11949479.html
Copyright © 2011-2022 走看看