MySQL如何快速创建大量随机数据进行性能测试

发布于 2022-08-24 10:54:55 字数 57 浏览 27 评论 0

我想测试一下程序在几十万行数据下的性能,所以要创建许多随机的数据,有人有好的方法快速创建这些数据吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

ぃ双果 2022-08-31 10:54:55

写成程序生成,保存成文本,然后mysql里用load data载入进去,几十万条量不算大 应该挺快的。

浪漫之都 2022-08-31 10:54:55

使用apache jmeter进行操作

抱猫软卧 2022-08-31 10:54:55

思路:创建procedure,然后使用循环,不停insert数据。例如:

create procedure inst(n int)
begin
declare i int default 0;
set autocommit = 0;
repeat
set i = i + 1;
insert into xxx values(....);
until i=n  end repeat;
commit;
set autocommit = 1;
end/

当然,这样太死了,全部是固定数据,我们可以来创建function来返回些随机数据:
1. 随机产生数字,范围1~3000(范围可以随意设定,我自身举个列子)

create function rn()
returns smallint
begin
declare res smallint default 0;
set res=floor(1+rand()*3000) ; #这里1和3000的位置可以更改为你需要的范围。
return res;
end/
  1. 随机返回指定字符个数,字符范围为大学写字母之间
create function rs(n int)
returns varchar(1024)
begin
declare chars char(52) default 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
declare res varchar(1024) default '';
declare i int default 0;
repeat
set i = i + 1;
set res = concat(res,substring(chars,floor(1+rand()*52),1));
until i=n end repeat;
return res;
end/

创建完这些function后,我们就可以使用rn()和rs(n)来获取数据数据并insert入测试表了,例如:

create procedure inst(n int)
begin
declare i int default 0;
set autocommit = 0;
repeat
set i = i + 1;
insert into xxx values(rn(),rs(12),rs(7),....);
until i=n  end repeat;
commit;
set autocommit = 1;
end/
过期情话 2022-08-31 10:54:55

快速为MySQL创建大量测试数据 :

  1. 引言
    在PostgreSQL中可以用generate_series()函数来快速生成大量测试数据,在MySQL中没有提供类似的东西。那么在做测试的时候,要往表中插入大量数据库该怎么办?可以写一个循环执行INSERT语句的存储过程,但这种方式还是太慢,我试了下,1秒钟居然只能插500条记录。比较快的方式是用程序生成一个数据文件,再用load data加载。但是直接用程序生成最终的测试数据的方式又不够灵活,因此我们可以借鉴generate_series()先做一个功能与之类似的临时数据表,再通过这个临时数据表生成大量测试数据。下面演示一下过程。

  2. 生成类似于generate_series()的临时数据表
    创建临时数据表tmp_series

create table tmp_series(id int,primary key(id));
用python生成100w记录的数据文件
python -c "for i in range(1,1+1000000): print(i)">100w.txt
也可以直接用bash做,但bash的方式要比python慢得多
[chenhj@localhost ~]$ i=1;while [ $i -le 1000000 ];do echo $i ;let i+=1; done >100w.txt
导入数据到tmp_series表
mysql> load data infile '/home/chenhj/100w.txt' replace into table tmp_series;
Query OK, 1000000 rows affected (9.66 sec)
Records: 1000000 Deleted: 0 Skipped: 0 Warnings: 0
生成100w记录花了9秒多。

  1. 生成测试数据
    创建测试数据表

create table tb1(id int,c1 int,c2 varchar(100),primary key(id))

通过tmp_series表生成并插入测试数据,测试数据的计算方法可以自由发挥。
mysql> insert into tb1 select id,round(rand()*100000),concat('testdatatestdatatestdata',id) from tmp_series;
Query OK, 1000000 rows affected (11.03 sec)
Records: 1000000 Duplicates: 0 Warnings: 0
生成100w记录花了11秒,是不是挺快的!
最后生成的测试数据是长这样的。

mysql> select * from tb1 order by id limit 2;
idc1c2
1648testdatatestdatatestdata1
2111testdatatestdatatestdata2

2 rows in set (0.00 sec)

如果只想生成小的数据集,比如1000条记录,可以使用limit。
insert into tb1 select id,round(rand()*1000),concat('testdatatestdatatestdata',id) from tmp_series order by id limit 1000;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文