zoukankan      html  css  js  c++  java
  • 用存储过程向数据库添加大量数据【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);
  • 相关阅读:
    ES6 => 箭头函数
    从零开始, 探索transition(vue-2.0)
    从零开始,零基础,一点一点探索vue-router(vue2.0)
    解决Vue请求 ‘No 'Access-Control-Allow-Origin' header is present on the requested resource’错误
    超详细,用canvas在微信小程序上画时钟教程
    钱兔
    天天飞燕
    小鱼
    键盘处理
    兼容iOS 10 资料整理笔记
  • 原文地址:https://www.cnblogs.com/fyter/p/stored_procedure_gen_much_data.html
Copyright © 2011-2022 走看看