mysql利用存储过程批量插入数据

时间:2022-06-09 09:54:04

最近需要测试一下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 INT, IN 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条数据。可以写个脚本执行:

  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