mysql利用存儲過程批量插入數(shù)據(jù)
來源:程序員人生 發(fā)布時間:2014-11-25 08:46:35 閱讀次數(shù):3714次
最近需要測試1下mysql單表數(shù)據(jù)到達1000W條以上時增刪改查的性能。由于沒有現(xiàn)成的數(shù)據(jù),因此自己構(gòu)造,本文只是實例,和簡單的介紹。
首先固然是建表:
CREATE TABLE `fortest` (
`ID` INT(30) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`IP` VARCHAR(32) NOT NULL,
`OID` VARCHAR(15) DEFAULT NULL)
其次,構(gòu)建存儲進程:
DELIMITER $$
USE `插入表所在的http://www.jyygyx.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 ;
上述存儲進程指定了兩個輸入?yún)?shù):IP_NUM OID_NUM,兩個參數(shù)分別指定了有多少臺機器,和每臺機器有多少OID。
以后調(diào)用存儲進程就能夠了:
call autoinsert 1000 50
意思是,有100臺機器,每一個機器有50個參數(shù)。
這樣,我們就構(gòu)建了50000條數(shù)據(jù),如果按上述存儲進程,想到達1000W的數(shù)據(jù),還是要花點時間的。可以采取以下方法,進1步提高速度:
首先創(chuàng)建具有一樣表結(jié)構(gòu)的表:
CREATE TABLE fortest_2 LIKE fortest;
然后根據(jù)fortest表插入5W條數(shù)據(jù)
INSERT INTOfortest_2(IP,OID) SELECT IP,ROUND(RAND() * 100) + 1) FROM fortest;
上述1條語句履行速度特別快,瞬間就插入了5W條數(shù)據(jù)。可以寫個腳本履行:
#!/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
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈