测试环境:
软件:windows xp sp3,IIS6.0,php5.2.5,mysql 5.0.22-community-nt;
硬件:dell 745商务机.
php的一大优势就是可以连接各种数据库,所以它提供的数据库接口也是比较多的,如果再算上中间层,更是数不胜数.我测试了3种使用比较多的接口,分别是直接连接数据库接口(libmysql.dll),pdo(php5以后提供的新接口,未来php6会取代各种各样的数据库接口),以及中间层mdb2(pear提供的).
主要测试批量插入数据的执行时间.这个时间包括数据库连接时间,执行sql时间.测试内容为向同一个表插入10000条数据.(表包括2个字段,其中一个是主键(int),逐渐增加).由于php没有并发机制,所以采用循环执行
其中直接连接数据库效果如下:
script execute 112.74195194244 seconds.
而pdo效果为:
script execute 99.059583902359 seconds.
mdb2的效率稍微低点:
script execute 118.64230298996 seconds.
其中mdb2是采用可移植的写法,即mdb2进行是sql重写.如果采用不重写方式(不重写的话如果移植数据库的时候需要程序重写sql语句).效率如下:
script execute 104.3069460392 seconds.
以上为直接执行的效果,其中pdo和mdb2包含有事务功能,所以如果是这样的情况的话,采用事务处理机制,效率可以分别提高8倍左右.如果我们需要考虑移植数据库的话,建议采用mdb2可以减轻工作量,但是如果我们有更好的机制,可以自己写一个中间层,使用pdo连接,这样效率上会更高.
附程序代码:
直接连接数据库:
<?php
$time_start = microtime_float();
$db = mysql_connect("localhost","root","woaikenan") or die("connect to db fault!!!");
mysql_select_db("test", $db) or die("select db fault!!!");
$sql = "insert into test set name=’test’";
for($i = 0;$i < 10000; ++$i)
{
mysql_query($sql);
}
$time_end = microtime_float();
$time = $time_end – $time_start;
echo "script execute $time seconds\n";
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
?>
使用pdo:
<?php
$time_start = microtime_float();
try {
$dbh = new PDO(‘mysql:host=localhost;dbname=test’, ‘root’, ‘woaikenan’,
array(PDO::ATTR_PERSISTENT => true));
echo "Connected\n";
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//$dbh->beginTransaction();
for($i = 0;$i < 10000; ++$i)
{
//$dbh->exec("insert into test set name=’test’");
$dbh->exec("insert into test set name=’test’");
}
//$dbh->commit();
} catch (Exception $e) {
//$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
$time_end = microtime_float();
$time = $time_end – $time_start;
echo "script execute $time seconds\n";
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
?>
使用mdb2:
<?php
// Create a valid MDB2 object named $mdb2
// at the beginning of your program…
require_once ‘MDB2.php’;
$time_start = microtime_float();
$mdb2 =& MDB2::connect(‘mysql://root:woaikenan@localhost/test’);
if (PEAR::isError($mdb2)) {
die($mdb2->getMessage());
}
for($i = 0;$i < 10000; ++$i)
{
/*$types = array(‘integer’, ‘text’);
$sth = $mdb2->prepare(‘INSERT INTO test VALUES (?, ?)’, $types, MDB2_PREPARE_MANIP);
$data = array("", ‘test’);
$affectedRows = $sth->execute($data);*/
$mdb2->exec(‘insert into test set name="test"’);
}
$time_end = microtime_float();
$time = $time_end – $time_start;
echo "script execute $time seconds\n";
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
?>
许石南 技术 mdb2, mysql, pdo, php, 性能, 性能测试
最新评论