首页 »PHP教程 » mysqlimysql:MySQL vs MySQLi 執行效能比較(一) »正文
mysqlimysql:MySQL vs MySQLi 執行效能比較(一)
来源: 发布时间:星期一, 2009年1月12日 浏览:23次 评论:0
傳統 ![](/icons/72738de.gif) php connect mysql ![](/icons/72738de.gif) 方式 ![](/icons/72738dou.gif) 必須先建立 ![](/icons/72738yi.gif) 條連線後 ![](/icons/72738dou.gif) 再進行select db ![](/icons/72738de.gif) 動作 ![](/icons/72738dou.gif) 在新版 ![](/icons/72738de.gif) php中 ![](/icons/72738dou.gif) 已經可以在建立連線 ![](/icons/72738de.gif) function裡加上db name ![](/icons/72738dou.gif) 不用撰寫兩行 ![](/icons/72738de.gif) 程式碼才能建立完成db連線 ![](/icons/72738dou2.gif) 除了更改db連線方式的外 ![](/icons/72738dou.gif) mysql ![](/icons/72738de.gif) query方式也有新 ![](/icons/72738de.gif) function加入 ![](/icons/72738dou.gif) mysql ![](/icons/72738de.gif) 執行方式不再是 ![](/icons/72738yi.gif) 個query ![](/icons/72738yi.gif) 行指令 ![](/icons/72738dou.gif) 也就是說 ![](/icons/72738dou.gif) 如果你要執行多筆insert或update時 ![](/icons/72738dou.gif) sql指令可以不用放在迴圈裡面跑了 ![](/icons/72738dou2.gif) 不過效能是很重要 ![](/icons/72738de.gif) ![](/icons/72738dou.gif) 到底這樣 ![](/icons/72738de.gif) 改變除了方便程式撰寫的外 ![](/icons/72738dou.gif) 對效能有無提升呢?我做了以下 ![](/icons/72738de.gif) 測試: <? /* CREATE TABLE `Loadingtest` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `LT1` VARCHAR( 12 ) NOT NULL , `LT2` VARCHAR( 12 ) NOT NULL , `LT3` VARCHAR( 12 ) NOT NULL , `LT4` VARCHAR( 12 ) NOT NULL ) ENGINE = MYISAM ; */ function caclutime { $time = explode( " ", microtime ); $usec = (double)$time[0]; $sec = (double)$time[1];
$sec + $usec; } /*/-------傳統跑迴圈Insert--- $begin_time=caclutime ; $link = mysql_connect("host", "username", "password"); mysql_select_db("test",$link); for($i=0;$i<100000;$i ){ $LT1=rand(0,10000); $LT2=rand(0,10000); $LT3=rand(0,10000); $LT4=rand(0,10000); $sql="INSERT INTO Loadingtest SET LT1='".$LT1."',LT2='".$LT2."',LT3='".$LT3."',LT4='".$LT4."'"; mysql_query($sql,$link); } $end_time=caclutime ; $total=$end_time-$begin_time; //13.464846134186 echo $total."n"; //------------------------------/*/ /*/-------mysqli Insert--- $begin_time=caclutime ; $link = mysqli_connect("host", "username", "password","test"); for($i=0;$i<100000;$i ){ $LT1=rand(0,10000); $LT2=rand(0,10000); $LT3=rand(0,10000); $LT4=rand(0,10000); $sql="INSERT INTO Loadingtest SET LT1='".$LT1."',LT2='".$LT2."',LT3='".$LT3."',LT4='".$LT4."'"; mysqli_query($link,$sql); } $end_time=caclutime ; $total=$end_time-$begin_time; //13.800211191177 echo $total."n"; //------------------------------/*/ /*/-------mysqli statements Insert--- $begin_time=caclutime ; $link = mysqli_connect("host", "username", "password","test"); $stmt = mysqli_prepare($link,"INSERT INTO Loadingtest SET LT1=?,LT2=?,LT3=?,LT4=?"); for($i=0;$i<100000;$i ){ $LT1=rand(0,10000); $LT2=rand(0,10000); $LT3=rand(0,10000); $LT4=rand(0,10000); mysqli_stmt_bind_param($stmt, "iiii", $LT1, $LT2, $LT3, $LT4); mysqli_stmt_execute($stmt); } $end_time=caclutime ; $total=$end_time-$begin_time; //11.837828874588 echo $total."n"; //------------------------------/*/ /*/-------mysqli multi_query Insert--- $begin_time=caclutime ; $link = mysqli_connect("host", "username", "password","test"); for($i=0;$i<100000;$i ){ $LT1=rand(0,10000); $LT2=rand(0,10000); $LT3=rand(0,10000); $LT4=rand(0,10000); $sql.="INSERT INTO Loadingtest SET LT1='".$LT1."',LT2='".$LT2."',LT3='".$LT3."',LT4='".$LT4."';"; } mysqli_multi_query($link,$sql); $end_time=caclutime ; $total=$end_time-$begin_time; //1.9740197658539 echo $total."n"; //------------------------------/*/ ?> 測試 ![](/icons/72738de.gif) 結果告訴我們 ![](/icons/72738dou.gif) 多筆sql語法執行 ![](/icons/72738de.gif) 方式以multi_query最佳 ![](/icons/72738dou.gif) 但multi_query會不會讓程式碼產生SQL Injection ![](/icons/72738de.gif) 漏洞 ![](/icons/72738dou.gif) 這必需要再經過完整 ![](/icons/72738de.gif) 測試 ![](/icons/72738dou2.gif) 當然還有loaddata infile ![](/icons/72738de.gif) 方式 ![](/icons/72738dou.gif) 不過我沒有將這次測試加入loaddata infile ![](/icons/72738dou.gif) 這留給其他朋友去測試 ![](/icons/72738dou2.gif) ps.要知道您 ![](/icons/72738de.gif) php有沒有支援mysqli ![](/icons/72738dou.gif) 到phpinfo ![](/icons/72738kh.gif) ;裡看 ![](/icons/72738yi.gif) 下就知道了
相关文章
读者评论
发表评论
|
|