[Php-Mysql]多條數據的循環插入和一次性插入的性能測試

/**
 * Author:RDP
 * My mail:[email protected]
 * My blog: blog.teamhaka.com

*/


A 測試說明:
主要比較所花時間,包括sql執行時間和最低限度php程序執行時間,不包括數據庫鏈接和關閉數據庫的時間。
表結構中有9列。
測試以分別插入10、20、50、100、200、500、1000、2000行數據來進行。

B 測試環境: 
1 php和mysql同在一臺Vista主機上
2 mysql版本5.1.41
3 php版本5.3.1

C 測試結論:
一次性插入快於循環插入。
結果數據如下(單位秒):

各行三部分的數據含義爲  結束時間、起始時間、結束時間與起始時間差值

Insert Rows:10
Once insert: 1309098893.9652	1309098893.964		0.0011539459228516
Loop insert: 1309098893.9772	1309098893.9726		0.0045840740203857

Insert Rows:20
Once insert: 1309098893.9815	1309098893.9803		0.0012009143829346
Loop insert: 1309098893.9892	1309098893.9841		0.0051271915435791

Insert Rows:50
Once insert: 1309098893.9938	1309098893.9929		0.00085210800170898
Loop insert: 1309098894.0051	1309098893.9964		0.0087730884552002

Insert Rows:100
Once insert: 1309098894.0096	1309098894.0083		0.0012550354003906
Loop insert: 1309098894.0307	1309098894.0128		0.017880916595459

Insert Rows:200
Once insert: 1309098894.0356	1309098894.0335		0.0021400451660156
Loop insert: 1309098894.072	1309098894.0385		0.033463954925537

Insert Rows:500
Once insert: 1309098894.0814	1309098894.0757		0.00565505027771
Loop insert: 1309098894.1801	1309098894.0846		0.095527172088623

Insert Rows:1000
Once insert: 1309098894.1934	1309098894.1838		0.0095570087432861
Loop insert: 1309098894.3763	1309098894.1962		0.18014216423035

Insert Rows:2000
Once insert: 1309098894.4275	1309098894.3793		0.048200130462646
Loop insert: 1309098894.8203	1309098894.4318		0.38853096961975
     


D 測試代碼及表結構:
1 表結構

   CREATE TABLE IF NOT EXISTS `insertTest` (
  `id` int(10) ,
  `data1` varchar(20) NOT NULL DEFAULT '',
  `data2` varchar(20) NOT NULL DEFAULT '',
  `data3` varchar(20) NOT NULL DEFAULT '',
  `data4` varchar(20) NOT NULL DEFAULT '',
  `data5` varchar(20) NOT NULL DEFAULT '',
  `data6` varchar(20) NOT NULL DEFAULT '',
  `data7` varchar(20) NOT NULL DEFAULT '',
  `data8` varchar(20) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

2 測試代碼

$dbConfig["hostName"] = "localhost";
$dbConfig["userName"] = "root";
$dbConfig["userPw"] = "";
$dbConfig['dbName'] = 'test';
$dbConfig['tbName'] = 'insertTest';

function insertTest($dbConfig,$rows=1){
	//input check
	if($rows<1){
		return false;
	}

	/***** 一次性插入 TEST *****/
	//db connect
	$dbHander = @mysql_connect($dbConfig['hostName'], $dbConfig['userName'], $dbConfig['userPw']);
	if(!dbHander){
		die("Db connect: Faile");
	}
	if(!@mysql_select_db($dbConfig['dbName'],$dbHander)) {
            die('Db select: Faile');
        }

	//start
	$resultOnce['startTime'] = microtimeFloat();
	$sqlOnce = " INSERT INTO $dbConfig[tbName] (id,data1,data2,data3,data4,data5,data6,data7,data8) values ";
	$onceRows = $rows;
	while($onceRows>0){
		$sqlOnce .= " ( '$onceRows','data1','data2','data3','data4','data5','data6','data7','data8'  ),";
		$onceRows--;
	}
	$sqlOnce = substr( $sqlOnce,0,-1);

	//$resultOnce['sqlExecStart'] = microtimeFloat();
	$query = mysql_query($sqlOnce,$dbHander);
	//$resultOnce['sqlExecEnd'] = microtimeFloat();

	//end
	$resultOnce['endTime'] = microtimeFloat();

	if(!$query){
		die('Query Error: '.$sqlOnce);
	}
	// db close
	@mysql_close($dbHander);
	/***** 一次性插入 TEST *****/

	/***** 循環插入 TEST *****/
	//db connect
	$dbHander = @mysql_connect($dbConfig['hostName'], $dbConfig['userName'], $dbConfig['userPw']);
	if(!dbHander){
		die("Db connect: Faile");
	}
	if(!@mysql_select_db($dbConfig['dbName'],$dbHander)) {
            die('Db select: Faile');
        }

	//start
	$resultLoop['startTime'] = microtimeFloat();
	$loopRows = $rows;
	while($loopRows>0){
		$query = mysql_query(" INSERT INTO $dbConfig[tbName](id,data1,data2,data3,data4,data5,data6,data7,data8) values( '$loopRows','data1','data2','data3','data4','data5','data6','data7','data8'  ) ",$dbHander);
		if(!$query){
			die('Loop Query Error');
		}
		$loopRows--;
	}

	//end
	$resultLoop['endTime'] = microtimeFloat();
	// db close
	@mysql_close($dbHander);
	/***** 循環插入 TEST *****/

	echo 'Insert Rows:'.$rows;
	echo 'Once insert: '.$resultOnce['endTime'].'	'.$resultOnce['startTime'].'		'.($resultOnce['endTime']-$resultOnce['startTime']);
	echo 'Loop insert: '.$resultLoop['endTime'].'	'.$resultLoop['startTime'].'		'.($resultLoop['endTime']-$resultLoop['startTime']).'

';

}

function microtimeFloat() {
	list($usec, $sec) = explode(" ", microtime());
	return ((float)$usec + (float)$sec);
}

insertTest($dbConfig,10);
insertTest($dbConfig,20);
insertTest($dbConfig,50);
insertTest($dbConfig,100);
insertTest($dbConfig,200);
insertTest($dbConfig,500);
insertTest($dbConfig,1000);
insertTest($dbConfig,2000);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章