預分配ID的設計,需要先為資料庫生成大量的數據。比如對用戶ID有要求的系統,那麼用戶ID就要預先生成。 通過python,php,c/c++/c#,js等程式生成也是可以,但需要這些程式環境,而且單條插入太慢,又因為數據包大小問題,需要切割INSERT語句。還要寫連接字元串,安裝組件等等,比較麻煩。 ...
預分配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);