預分配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);