最近需要測試一下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 `插入表所在的數據庫名字`$$ 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的數據,還是要花點時間的。可以采用如下方法,進一步提高速度:
首先創建具有同樣表結構的表:
CREATE TABLE fortest_2 LIKE fortest;
然後根據fortest表插入5W條數據
INSERT INTOfortest_2(IP,OID) SELECT IP,ROUND(RAND() * 100) + 1) FROM fortest;
上述一條語句執行速度特別快,瞬間就插入了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