mysql 插入百万条数据

时间:2021-05-01 23:31:06

利用mysql内存表插入速度快的特点,先存储过程在内存表中生成数据,然后再从内存表插入普通表中

一.创建内存表

CREATE TABLE `vote_record_memory` ( 
  `id` INT (11) NOT NULL AUTO_INCREMENT, 
  `name` VARCHAR (50) NOT NULL,
  `pwd` VARCHAR(32) NOT NULL,
  `create_time` datetime NOT NULL, 
  PRIMARY KEY (`id`)
) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

二.创建普通表

CREATE TABLE `vote_record_memory` ( 
  `id` INT (11) NOT NULL AUTO_INCREMENT, 
  `name` VARCHAR (50) NOT NULL,
  `pwd` VARCHAR(32) NOT NULL,
  `create_time` datetime NOT NULL, 
  PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

三.创建一个函数,用于生成随机字符串

CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
BEGIN 
  DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
  DECLARE return_str varchar(255) DEFAULT '' ;
  DECLARE i INT DEFAULT 0; 
  WHILE i < n DO 
    SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); 
    SET i = i +1; 
  END WHILE; 
  RETURN return_str; 
END

四.创建存储过程

CREATE PROCEDURE `add_data`(IN n int)
BEGIN 
  DECLARE i INT DEFAULT 1;
  WHILE (i <= n ) DO
    INSERT into test (name,pwd,create_time ) VALUES (rand_string(50),MD5(123456) ,now() );
    set i=i+1;
  END WHILE;
END

五.调用存储过程

CALL add_data(1000000);

由于mysql 默认内存允许容量小,会出现如下报错

   mysql 插入百万条数据

windows 操作系统 找到 my.ini 修改  ,不同的集成环境,配置会有差别,修改max_heap_table_size = 1024M,或者添加进去即可,重启mysql,根据电脑性能不能所花时间不一样,大概时间在小时级别

六.插入到普通表中

INSERT into test2 SELECT * from test;