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

最近想到創建一個大量數據的測試環境,於是找瞭一下怎麼插入100W條數據,我用的是20個字段。對比一下,首先是用 mysql 的存儲過程弄的:

mysql>delimiter $

mysql>SET AUTOCOMMIT = 0$$

 

mysql> create  procedure test() 

begin  www.aiwalls.com  

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;

   www.aiwalls.com  

結果

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");

    }  www.aiwalls.com  

    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中間省略瞭很多中間步驟,導致插入速度遠勝於第一種,具體的沒有研究。

 

 

 

作者 技術熊貓

發佈留言