用存儲過程向數據庫添加大量數據【mysql】


預分配ID的設計,需要先為數據庫生成大量的數據。比如對用戶ID有要求的系統,那么用戶ID就要預先生成。

 

通過python,php,c/c++/c#,js等程序生成也是可以,但需要這些程序環境,而且單條插入太慢,又因為數據包大小問題,需要切割INSERT語句。還要寫連接字符串,安裝組件等等,比較麻煩。

我寫了一個通過存儲過程即可實現大批量插入的代碼,雖然也是要切割,但減少了很多環節,使數據庫部分更完整,更容易分發與部署。

其核心思想是拼接字符串concat,執行execute,大於1萬行則分開執行。

首先創建測試用的表:

CREATE TABLE `map` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gp` point DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

然后是存儲過程:

CREATE PROCEDURE `init_map`(in count int)
BEGIN
    declare jump int DEFAULT count;
    WHILE jump>0 DO BEGIN
        DECLARE i INT DEFAULT 1;
        DECLARE c INT DEFAULT jump;
        IF c>10000 THEN
            SET c=10000;
        END IF;
        SET @sq=concat("INSERT INTO map(gp) VALUES (st_geomfromtext('POINT(",(rand()*50+75)," ",(rand()*50+75),")'))");
        WHILE i<c DO
          SET @sq=concat(@sq,",(st_geomfromtext('POINT(",(rand()*50+75)," ",(rand()*50+75),")'))");
          SET i=i+1;
        END WHILE;
        SELECT @sq;
        PREPARE s FROM @sq;
        EXECUTE s;
        DEALLOCATE PREPARE s;
        SET jump=jump-c;
    END;
    END WHILE;
END

 然后是執行存儲過程,10萬行,觀察時間,當然是很快的。

CALL init_map(100000);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM