码迷,mamicode.com
首页 > 数据库 > 详细

用存储过程向数据库添加大量数据【mysql】

时间:2018-12-21 16:07:10      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:innodb   比较   nod   js等   auto   观察   oca   table   用户id   

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

 

用存储过程向数据库添加大量数据【mysql】

标签:innodb   比较   nod   js等   auto   观察   oca   table   用户id   

原文地址:https://www.cnblogs.com/fyter/p/stored_procedure_gen_much_data.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!