程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql利用存儲過程批量插入數據

mysql利用存儲過程批量插入數據

編輯:MySQL綜合教程

mysql利用存儲過程批量插入數據


最近需要測試一下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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved