天天看點

快速為MySQL建立大量測試資料

在PostgreSQL中可以用generate_series()函數來快速生成大量測試資料,在MySQL中沒有提供類似的東西。那麼在做測試的時候,要往表中插入大量資料庫該怎麼辦?可以寫一個循環執行INSERT語句的存儲過程,但這種方式還是太慢,我試了下,1秒鐘居然隻能插500條記錄。比較快的方式是用程式生成一個資料檔案,再用load data加載。但是直接用程式生成最終的測試資料的方式又不夠靈活,是以我們可以借鑒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

建立測試資料表

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

最後生成的測試資料是長這樣的。

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;