mysql中迅速插入百萬(wàn)條測(cè)試數(shù)據(jù)的方法
更新時(shí)間:2012年04月14日 02:17:48 作者:
最近想到創(chuàng)建一個(gè)大量數(shù)據(jù)的測(cè)試環(huán)境,于是找了一下怎么插入100W條數(shù)據(jù),我用的是20個(gè)字段
對(duì)比一下,首先是用 mysql 的存儲(chǔ)過(guò)程弄的:
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;
結(jié)果
mysql> call test; Query OK, 0 rows affected (58 min 30.83 sec)
非常耗時(shí)。
于是我又找了一個(gè)方法
先用PHP代碼生成數(shù)據(jù),再導(dǎo)入:
<?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"寫(xiě)入成功,耗時(shí):",mktime()-$t;
}
然后再導(dǎo)入
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`);
注意字段不再以逗號(hào)分割,以\t分割,條記錄以\r\n分割。結(jié)果我插入10次數(shù)據(jù),100W平均只要1分鐘搞定。
第二種方式mysql中間省略了很多中間步驟,導(dǎo)致插入速度遠(yuǎn)勝于第一種,具體的沒(méi)有研究。
快速生成mysql上百萬(wàn)條測(cè)試數(shù)據(jù)
由于測(cè)試需要,原表中只有1萬(wàn)條數(shù)據(jù),現(xiàn)在隨機(jī)復(fù)制插入記錄,快速達(dá)到100萬(wàn)條。
itemid是主鍵。
運(yùn)行幾次下面代碼。隨機(jī)取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的數(shù)字了。改為5000或者1萬(wàn)。很快可以達(dá)到100萬(wàn)的數(shù)據(jù)量了。
復(fù)制代碼 代碼如下:
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;
結(jié)果
mysql> call test; Query OK, 0 rows affected (58 min 30.83 sec)
非常耗時(shí)。
于是我又找了一個(gè)方法
先用PHP代碼生成數(shù)據(jù),再導(dǎo)入:
復(fù)制代碼 代碼如下:
<?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"寫(xiě)入成功,耗時(shí):",mktime()-$t;
}
然后再導(dǎo)入
復(fù)制代碼 代碼如下:
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`);
注意字段不再以逗號(hào)分割,以\t分割,條記錄以\r\n分割。結(jié)果我插入10次數(shù)據(jù),100W平均只要1分鐘搞定。
第二種方式mysql中間省略了很多中間步驟,導(dǎo)致插入速度遠(yuǎn)勝于第一種,具體的沒(méi)有研究。
快速生成mysql上百萬(wàn)條測(cè)試數(shù)據(jù)
由于測(cè)試需要,原表中只有1萬(wàn)條數(shù)據(jù),現(xiàn)在隨機(jī)復(fù)制插入記錄,快速達(dá)到100萬(wàn)條。
itemid是主鍵。
運(yùn)行幾次下面代碼。隨機(jī)取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的數(shù)字了。改為5000或者1萬(wàn)。很快可以達(dá)到100萬(wàn)的數(shù)據(jù)量了。
相關(guān)文章
Windows下MySQL 5.6安裝及配置詳細(xì)圖解(大圖版)
這篇文章主要介紹了Windows下MySQL 5.6安裝及配置詳細(xì)圖解(大圖版),需要的朋友可以參考下2016-04-04MySql利用父id遞歸向下查詢(xún)子節(jié)點(diǎn)的方法實(shí)例
項(xiàng)目中遇到一個(gè)需求,要求查處菜單節(jié)點(diǎn)的所有節(jié)點(diǎn),在網(wǎng)上查了一下,大多數(shù)的方法用到了存儲(chǔ)過(guò)程,由于線上環(huán)境不能隨便添加存儲(chǔ)過(guò)程,所以自己寫(xiě)一個(gè),這篇文章主要給大家介紹了關(guān)于MySql利用父id遞歸向下查詢(xún)子節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-03-03MySQL 4G內(nèi)存服務(wù)器配置優(yōu)化
MySQL對(duì)于web架構(gòu)性能的影響最大,也是關(guān)鍵的核心部分。下面我們了解一下MySQL優(yōu)化的一些基礎(chǔ),MySQL自身(my.cnf)的優(yōu)化2017-07-07mysql獲取當(dāng)前日期年月的兩種實(shí)現(xiàn)方式
這篇文章主要介紹了mysql獲取當(dāng)前日期年月的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07mysql數(shù)據(jù)庫(kù)刪除重復(fù)數(shù)據(jù)只保留一條方法實(shí)例
這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫(kù)刪除重復(fù)數(shù)據(jù),只保留一條的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03MySQL中的布爾值,怎么存儲(chǔ)false或true
這篇文章主要介紹了MySQL中的布爾值,怎么存儲(chǔ)false或true的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06sql語(yǔ)句中l(wèi)ike的用法詳細(xì)解析
以下是對(duì)sql語(yǔ)句中l(wèi)ike的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08