话不多说,直接开始
以生成“用户表”测试数据为例
第一步:生成基础数据
//生成基础数据
delimiter $$
create procedure insert_llll(in start int(10),in max_num int(10))
begin
declare i int default 0;
declare newChar varchar(100) default '';
declare j int default 0;
set autocommit = 0;
repeat
set i = i +1;
set j = start+i;
set newChar = concat('', LPAD((i), 3, '0'));
insert into user_tb (Uid, head,wxAcount,wxName,zfbAcount,zfbName,tel,note) values (j,
substring(MD5(RAND()),1, RAND()*30), substring(MD5(RAND()),1, RAND()*20), substring(MD5(RAND()),1, RAND()*10), substring(MD5(RAND()),1, RAND()*10), substring(MD5(RAND()),1, RAND()*10), substring(MD5(RAND()),1, RAND()*10),
newChar);
until i = max_num
end repeat;
commit;
end $$
delimiter ;
//调用存储过程,生成note从001到999的999个数据
call insert_llll(1000000,999);
生成结果部分截图如下:
这里生成的最初的999个数据是最基础的原始数据,是最原始的“父编码”
第二步:生成之后的数据
基本原理:
1)从表中随机抽取一条纪录,提取其中的note值,将提取到的note值作为“父编码”;
2)随机一个1~200之间的整数(j),j也就是“父编码”的紧接着的下一级的子编码个数;
3)从1开始,一直到 j 进行循环,在每一次循环中插入 “父编码”+“xxx”,如:“父编码”为001,循环到第54个,那么“xxx”也就是054,最终插入的“新note”就是 001054。
4)这只是大致原理,最重要的还是看代码
delimiter $$
CREATE PROCEDURE `insert_la4`(in start int(10),in max_num int(10))
begin
/***** i 总循环计数 ******/
declare i int default 0;
declare k int default 0;
/***** j 子循环计数 ******/
declare j int default 0;
declare count int default 0;
/***** str1 父编码 ******/
declare str1 text default '';
/***** newChar 新生产的子编码部分 ******/
declare newChar varchar(100) default '';
/***** 最终插入时的note值(由str1和newChar拼凑而成) ******/
declare res text default '';
#set autocommit = 0 //把autocommit设置成0,这样可以只提交一次,否则。。。。。
set autocommit = 0;
set k = start;
repeat
set i = i +1;
SELECT note into str1
FROM user_tb AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(Uid) FROM user_tb)-(SELECT MIN(Uid) FROM user_tb))+(SELECT MIN(Uid) FROM user_tb)) AS Uid) AS t2
WHERE t1.Uid >= t2.Uid
ORDER BY t1.Uid LIMIT 1;
set j = 1+RAND()*200;
while count<j do
set count = count +1;
/***** 将count变为001型的格式 ******/
set newChar = concat('', LPAD((count), 3, '0'));
set res = concat(str1, newChar);
set k = k+1;
insert into user_tb (head,wxAcount,wxName,zfbAcount,zfbName,tel,note) values (
substring(MD5(RAND()),1, RAND()*10), 1, 1, 1, 1, 1,
res);
end while;
set count = 0;
until i = max_num
end repeat;
commit;
end $$
delimiter ;
执行,ok,完美。几分钟后成功生成500W条数据
部分结果如下
备注:
1)如果要运行此存储过程,最好先把所有注释去掉,防止意外(!!!???);
2)推荐设计表时将Uid设为int自增型,否则每次插入时数据库都要进行一次查询(确保Uid,即主键不重复),这将花费大量大量大量的时间。(毕竟只是测试数据,将Uid设为int型也没啥大不了);
3)当然,这里的代码并不适合其他人,本文章仅供了解其中的大概原理
4)mysql自带的随机抽取函数效率太慢,因此从网上搜了一个
5)其实还可以继续提高效率,合并insert之类的,但现在的已经完全足够了,再花时间研究那些东西,数据都能生成几亿条了。。。。。。。
(责任编辑:IT) |