zoukankan      html  css  js  c++  java
  • mysql利用存储过程批量插入数据

    最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能。由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍。

    首先当然是建表:

    1. CREATETABLE `fortest` (  
    2.   `ID` INT(30) UNSIGNED NOTNULL AUTO_INCREMENT PRIMARYKEY,  
    3.   `IP` VARCHAR(32) NOTNULL,  
    4.   `OID` VARCHAR(15) DEFAULTNULL)  

    其次,构建存储过程:

    1. DELIMITER $$  
    2. USE `插入表所在的数据库名字`$$  
    3. DROPPROCEDURE IF EXISTS `autoinsert`$$  
    4. CREATE DEFINER=`root`@`192.168.137.10` PROCEDURE `autoinsert`(IN IP_NUM INTIN OID_NUM INT)  
    5. BEGIN
    6. DECLARE iIP INTDEFAULT 0 ;  
    7. DECLARE iOID INTDEFAULT 0 ;     
    8.    WHILE(iIP < IP_NUM)  
    9.     DO  
    10. SET iOID = 0;  
    11.       WHILE(iOID
    12.       DO  
    13. SET @mySql=CONCAT("INSERT INTO fortest (IP, OID) VALUES(CONCAT((ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1),'.',(ROUND(RAND() * 255) + 1)),ROUND(RAND()*100)+1);");              
    14. PREPARE stmt FROM @mySql;  
    15. EXECUTE stmt;    
    16. DEALLOCATEPREPARE stmt;  
    17. SET iIP = iIP+1;  
    18. END WHILE;  
    19. SET iPC = iPC+1;  
    20. END WHILE;  
    21. END$$  
    22. DELIMITER ;  

    上述存储过程指定了两个输入参数:IP_NUM  OID_NUM,两个参数分别指定了有多少台机器,以及每台机器有多少OID。

    之后调用存储过程就可以了:

    1. call autoinsert 1000 50  


    意思是,有100台机器,每个机器有50个参数。

    这样,我们就构建了50000条数据,如果按上述存储过程,想达到1000W的数据,还是要花点时间的。可以采用如下方法,进一步提高速度:

    首先创建具有同样表结构的表:

    1. CREATETABLE fortest_2 LIKE fortest;  


    然后根据fortest表插入5W条数据

    1. INSERT INTOfortest_2(IP,OID) SELECT IP,ROUND(RAND() * 100) + 1) FROM fortest;  

    上述一条语句执行速度特别快,瞬间就插入了5W条数据。可以写个脚本执行:

    [plain]view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #!/bin/bash  
    2. i=1;  
    3. MAX_INSERT_ROW_COUNT=$1;  
    4. j=0;  
    5. while [ $i -le $MAX_INSERT_ROW_COUNT ]  
    6. do  
    7.     time mysql -h192.168.137.1 -uroot -p123456 fortest -e "INSERT INTOfortest_2(IP,OID) SELECT IP,ROUND(RAND() * 100) + 1) FROM fortest;"  
    8.     echo "INSERT $i "      
    9.     i=$(($i+1))  
    10. #    sleep 0.05  
    11. done  
    12. exit 0  




  • 相关阅读:
    ArcGIS几种数据格式
    C#中的接口
    OpenFileDialog获取文件名和文件路径问题
    OO与设计模式的原则、目标
    设计模式-工厂模式三部曲
    .NET设计模式: 工厂模式
    最详细eclipse汉化插件安装教程
    Eclipse IDE for C/C++ Developers安装配置详解
    使用 Eclipse C/C++ Development Toolkit 开发应用程序
    VS开发好用的扩展
  • 原文地址:https://www.cnblogs.com/hllnj2008/p/5138796.html
Copyright © 2011-2022 走看看