快速生成百万数据

1、生成思路
利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中
2、创建内存表及普通表

CREATE TABLE t_emm_process_memory (
id bigint(20) NOT NULL AUTO_INCREMENT,
appName varchar(255) DEFAULT NULL,
udid varchar(255) DEFAULT NULL,
processName varchar(255) DEFAULT NULL,
createTime datetime DEFAULT NULL,
runPath varchar(255) DEFAULT NULL,
runTime bigint(255) DEFAULT NULL,
runningTime varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
KEY index_id (processName) USING HASH
) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

上述memory就是新建的内存表 ! ! (重启服务会清空表数据)
普通表是 InnoDB
CREATE TABLE t_emm_process (
id bigint(20) NOT NULL AUTO_INCREMENT,
appName varchar(255) DEFAULT NULL,
udid varchar(255) DEFAULT NULL,
processName varchar(255) DEFAULT NULL,
createTime datetime DEFAULT NULL,
runPath varchar(255) DEFAULT NULL,
runTime bigint(255) DEFAULT NULL,
PRIMARY KEY (id) USING BTREE,
KEY index_id (id),
KEY index_processName (processName,runningTime,createTime) USING BTREE,
KEY index_processTime (createTime,runningTime) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3031586 DEFAULT CHARSET=utf8;

show variables like ‘log_bin_trust_function_creators’; 打开
set global log_bin_trust_function_creators=1;
执行过程中, 内存满的话需要修改my.ini
max_heap_table_size = 400000M在这里插入图片描述3、创建函数及存储过程

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_vote_memory`(IN n int)
BEGIN  
  DECLARE i INT DEFAULT 1;
    WHILE (i <= n ) DO
      INSERT into t_emm_process_memory(processName,runningTime,createTime) VALUEs (FLOOR(RAND() * 1000), FLOOR(RAND() * 100000), now());
            set i=i+1;
    END WHILE;
END

4、调用存储过程

CALL add_vote_memory(3000000); -- 生成了300万数据

5、插入普通表中

INSERT INTO t_emm_process(`processName`, `runningTime`, createTime) 
SELECT `processName`, `runningTime`, `createTime` FROM t_emm_process_memory;

只需要插入需要的字段即可!!!

6、结果
在这里插入图片描述
文章参考: https://blog.csdn.net/whzhaochao/article/details/49126037

本次优化主要是, 新增了组合索引(上述建表可以看到)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值