大家好,我是脚本小王子,今天和大家分享一下怎么样快速生成比较符合实际的测试数据。
快速生成测试数据的主要思想是:第一次插入一条记录,以后每次都利用表里已有的所有记录进行改写然后再次进行插入,因此生成的数据量就是2的N次方(N是执行插入的次数)。
我们直接看代码:
#建测试表
drop table if exists t;
CREATE TABLE t (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY comment '自增主键',
dept tinyint not null comment '部门id',
name varchar(30) comment '用户名称',
create_time datetime not null comment '注册时间',
last_login_time datetime comment '最后登录时间'
) comment '测试表';
#手工插入第一条测试数据,后面根据此行数据作为基础进行插入
insert into t values(1,1,'user_1', '2018-01-01 00:00:00', '2018-03-01 12:00:00');
set @i=1;
#==================此处拷贝反复执行,直接符合预想的数据量===================
#执行20次即2的20次方=1048576 条记录(100万)
#执行23次即2的23次方=8388608 条记录(800万)
#执行24次即2的24次方=16777216 条记录(1600万)
#执行25次即2的25次方=33554432 条记录(3300万)
#执行26次即2的26次方=67108864 条记录(6700万)
#执行27次即2的27次方=134217728 条记录(1亿3千万)
#......
insert into t(id, dept, name, create_time, last_login_time)
select @i:=@i+1,
left(rand()*10,1) as dept, #随机生成1~10的整数
concat('user_',@i), #按序列生成不同的name
date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), #生成有时间大顺序随机注册时间
date_add(date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND) #生成有时间大顺序的随机的最后登录时间
from t;
#==================此处结束反复执行=====================
#创建索引(视情况执行)
create index idx_dept on t(dept);
create index idx_create_time on t(create_time);
create index idx_last_login_time on t(last_login_time);
复制
本来写到这里就结束了,但小y说,这测试数据还要手工执行二三十次,还脚本小王子,笑掉别人牙了。好吧,这就安排一个简短的脚本:
# 初始化变量
mysqlHost='localhost' # mysql Host
mysqlPort=3306 # mysql端口
mysqlUser='root' # mysql账号
mysqlPwd='123456' # mysql密码
useDBName='test' # 测试表所在的库名
runBatch=10 # 循环次数 runBatch=20生成104万记录;23生成838万记录,24生成1677万记录,25生成3300万记录...
tableName='t' # 测试表表名
sql="
create database if not exists ${useDBName};
# 建测试表
CREATE TABLE ${tableName} (
id int NOT NULL AUTO_INCREMENT PRIMARY KEY comment '自增主键',
dept tinyint not null comment '部门id',
name varchar(30) comment '用户名称',
create_time datetime not null comment '注册时间',
last_login_time datetime comment '最后登录时间'
) comment '测试表';
#手工插入第一条测试数据,后面根据此行数据作为基础进行插入
insert into ${tableName} values(1,1,'user_1', '2018-01-01 00:00:00', '2018-03-01 12:00:00');
"
echo "${sql}" | mysql -h${mysqlHost} -u${mysqlUser} -p${mysqlPwd} -P${mysqlPort} ${useDBName}
sql="set @i = 1;"
# 循环拼接SQL
for i in $(seq 1 ${runBatch}); do
sql="${sql}
insert into ${tableName}(id, dept, name, create_time, last_login_time)
select @i:=@i+1,
left(rand()*10,1) as dept,
concat('user_',@i),
date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND),
date_add(date_add(create_time,interval +@i*cast(rand()*100 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND)
from ${tableName};
"
done
echo "${sql}" | mysql -h${mysqlHost} -u${mysqlUser} -p${mysqlPwd} -P${mysqlPort} ${useDBName}
复制
好了,本次分享就在这里,大家有什么更好的方法吗?请关注公众号留言告诉我吧。
声明:本文首次发表在CSDN,详情请点击下方“阅读原文”
长按下图二维码,关注更多数据库实用技巧。
文章转载自小灯数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1240次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
463次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
444次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
440次阅读
2025-03-04 21:56:13
SQL优化 - explain查看SQL执行计划(一)
金同学
382次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
327次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
313次阅读
2025-03-17 10:36:40
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
229次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
214次阅读
2025-03-21 15:30:53
MySQL 有没有类似 Oracle 的索引监控功能?
JiekeXu
192次阅读
2025-03-19 23:43:22