在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;