程序员人生 网站导航

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

栏目:互联网时间:2014-11-25 08:46:35

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

首先固然是建表:

CREATE TABLE `fortest` (   `ID` INT(30) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,   `IP` VARCHAR(32) NOT NULL,   `OID` VARCHAR(15) DEFAULT NULL)

其次,构建存储进程:

DELIMITER $$ USE `插入表所在的http://www.wfuyu.com/db/名字`$$ DROP PROCEDURE IF EXISTS `autoinsert`$$ CREATE DEFINER=`root`@`192.168.137.10` PROCEDURE `autoinsert`(IN IP_NUM INT, IN OID_NUM INT) BEGIN DECLARE iIP INT DEFAULT 0 ; DECLARE iOID INT DEFAULT 0 ; WHILE(iIP < IP_NUM) DO SET iOID = 0; WHILE(iOID<OID_NUM) DO 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);"); PREPARE stmt FROM @mySql; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET iIP = iIP+1; END WHILE; SET iPC = iPC+1; END WHILE; END$$ DELIMITER ;

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

以后调用存储进程就能够了:

call autoinsert 1000 50


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

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

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

CREATE TABLE fortest_2 LIKE fortest;


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

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

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

#!/bin/bash i=1; MAX_INSERT_ROW_COUNT=$1; j=0; while [ $i -le $MAX_INSERT_ROW_COUNT ] do time mysql -h192.168.137.1 -uroot -p123456 fortest -e "INSERT INTOfortest_2(IP,OID) SELECT IP,ROUND(RAND() * 100) + 1) FROM fortest;" echo "INSERT $i " i=$(($i+1)) # sleep 0.05 done exit 0




 


 

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐