快速为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秒多。

load data infile 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/100w.txt' replace into table tmp_series;

  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;
id c1 c2
1 648 testdatatestdatatestdata1
2 111 testdatatestdatatestdata2

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;


如果不能导入
1.进入mysql查看secure_file_prive的值


$mysql -u root -p


mysql>SHOW VARIABLES LIKE "secure_file_priv";


secure_file_prive=null   -- 限制mysqld 不允许导入导出


secure_file_priv=/tmp/   -- 限制mysqld的导入导出只能发生在/tmp/目录下


secure_file_priv=' '         -- 不对mysqld 的导入 导出做限制


===

生成数据也可以用java语言来写

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Random;




public class GeneralID {


public static void main(String[] args) {
// TODO Auto-generated method stub
Long start = System.currentTimeMillis();
       
       String prefix = "LF";    //前缀
        int num = 10;//数字位数
        int count = 1000000;//生成100W数量


        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH时mm分");
       
       //生成文件地址
        File f = new File("d:\\" + formatter.format(System.currentTimeMillis()) + ".txt");
       
       OutputStreamWriter writer = null;
       BufferedWriter bw = null;
       
       Random random = new Random();
       try {
           OutputStream os = new FileOutputStream(f);
           writer = new OutputStreamWriter(os);
           bw = new BufferedWriter(writer);
           int i=1;
           while(i<=count){
      
               try {
                   bw.write(i+"\r\n");
               } catch (Exception e) {
                   i--;
               }
             i++;
           }
           bw.flush();
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } finally {
           try {
               bw.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       Long end = System.currentTimeMillis();
       System.out.println("bufferedWrite And FileWriterTest's time---------" + (start - end)/1000d);
}


}


100W数据 花费时间0.45s左右



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值