mysql中迅速插入百萬條測試數據的方法


最近想到創建一個大量數據的測試環境,於是找了一下怎么插入100W條數據,我用的是20個字段

 
對比一下,首先是用 mysql 的存儲過程弄的: 
復制代碼代碼如下:

mysql>delimiter $ 
mysql>SET AUTOCOMMIT = 0$$ 
mysql> create procedure test() 
begin 
declare i decimal (10) default 0 ; 
dd:loop 
INSERT INTO `million` (`categ_id`, `categ_fid`, `SortPath`, `address`, `p_identifier`, `pro_specification`, `name`, `add_date`, `picture_url`, `thumb_url`, `is_display_front`, `create_html_time`, `hit`, `buy_sum`, `athor`, `templete _style`, `is_hot`, `is_new`, `is_best`) VALUES 
(268, 2, '0,262,268,', 0, '2342', '423423', '123123', '2012-01-09 09:55:43', 'upload/product/20111205153432_53211.jpg', 'upload/product/thumb_20111205153432_53211.jpg', 1, 0, 0, 0, 'admin', '0', 0, 0, 0); 
commit; 
set i = i+1; 
if i= 1000000 then leave dd; 
end if; 
end loop dd ; 
end;$ 
mysql>delimiter ; 
mysql> call test; 

結果 
mysql> call test; Query OK, 0 rows affected (58 min 30.83 sec) 
非常耗時。 
於是我又找了一個方法 
先用PHP代碼生成數據,再導入: 
復制代碼代碼如下:

<?php 
$t=mktime(); 
set_time_limit(1000); 
$myFile="e:/insert.sql"; 
$fhandler=fopen($myFile,'wb'); 
if($fhandler){ 
$sql="268\t2\t'0,262,268,'\t0\t '2342'\t'423423'\t'123123'\t'23423423'\t'2012-01-09 09:55:43'\t'upload/product/20111205153432_53211.jpg'\t'upload/product/thumb_20111205153432_53211.jpg'\tNULL\tNULL\t38\t'件'\t''\t123\t123\t0"; 
$i=0; 
while($i<1000000)//1,000,000 

$i++; 
fwrite($fhandler,$sql."\r\n"); 

echo"寫入成功,耗時:",mktime()-$t; 

然后再導入 
復制代碼代碼如下:

LOAD DATA local INFILE 'e:/insert.sql' INTO TABLE tenmillion(`categ_id`, `categ_fid`, `SortPath`, `address`, `p_identifier`, `pro_specification`, `name`, `description`, `add_date`, `picture_url`, `thumb_url`, `shop_url`, `shop_thumb_url`, `brand_id`, `unit`, `square_meters_unit`, `market_price`, `true_price`, `square_meters_price`); 

注意字段不再以逗號分割,以\t分割,條記錄以\r\n分割。結果我插入10次數據,100W平均只要1分鍾搞定。 
第二種方式mysql中間省略了很多中間步驟,導致插入速度遠勝於第一種,具體的沒有研究。 

快速生成mysql上百萬條測試數據
由於測試需要,原表中只有1萬條數據,現在隨機復制插入記錄,快速達到100萬條。 

itemid是主鍵。 

運行幾次下面代碼。隨機取1000條插入, 

insert into downitems (chid,catid,softid,....) 
SELECT chid,catid,softid... FROM `downitems` WHERE itemid >= (SELECT floor(RAND() * (SELECT MAX(itemid) FROM `downitems`))) ORDER BY itemid LIMIT 1000; 

然后可以修改1000的數字了。改為5000或者1萬。很快可以達到100萬的數據量了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM