php_mysqli 与 pdo 性能对比,php中使用mysql、mysqli、pdo连接数据库的用法和比较

PHP与mySQL的连接有三种API接口,分别是:PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案。

一、特性及对比

PHP的MySQL扩展是设计开发允许PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程 的接口,并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端 进行交互,但并不支持后期MySQL服务端提供的一些特性。由于太过古老,又不安全,所以已被后来的mysqli完全取代。

PHP的mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。其特点为:面向对象接口 、prepared语句支持、多语句执行支持、事务支持 、增强的调试能力、嵌入式服务支持 、预处理方式完全解决了sql注入的问题。不过其也有缺点, 就是只支持mysql数据库。如果你要是不操作其他的数据库,这无疑是最好的选择。

PDO是PHP Data Objects的缩写,其是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要 连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从oracle 到MySQL,仅仅需要修改很少的PHP代码。其功能类似于JDBC、ODBC、DBI之类接口。同样,其也解决了sql注入问题,有很好的安全性。不过 他也有缺点,某些多语句执行查询不支持(不过该情况很少)。

为了与MySQL数据库服务端进行交互,mysql扩展,mysqli扩展, PDO MySQL驱动都使用了实现了必要的协议的底层库。以前,可用的库只有MySQL客户端库和libmysql。

然而,libmysql包含的接口没有针对与PHP的应用交互进行优化,libmysql 是早期为C应用程序设计的。基于这个原因,MySQL Native驱动mysqlnd,作为libmysql的一个 针对PHP应用的修改版本被开发。

mysql,mysqli以及PDO Mysql驱动都可以各自配置使用 libmysql或者mysqlnd。mysqlnd作为一个专门设计 用于PHP系统的库,它在内存和速度上都比libmysql有很大提升。非常希望你去尝试这些提升。

特性比较

下表比较了PHP中三种主要的MySQL连接方式的功能:

PHP的mysqli扩展PDO (使用PDO MySQL驱动和MySQL Native驱动)PHP的mysql扩展引入的PHP版本5.05.03.0之前

PHP5.x是否包含是是是

MySQL开发状态活跃在PHP5.3中活跃仅维护

在MySQL新项目中的建议使用程度建议 - 首选建议不建议

API的字符集支持是是否

服务端prepare语句的支持情况是是否

客户端prepare语句的支持情况否是否

存储过程支持情况是是否

多语句执行支持情况是大多数否

是否支持所有MySQL4.1以上功能是大多数否

简单来说就是 :  mysqli(首选) pdo_mysql(建议) mysql(不建议)

下面是我这个星期做过的几种数据库连接的方式:

Mysql连接:

$conn = @ mysql_connect("localhost", "root", "") or die("数据库连接错误");

mysql_select_db("bbs", $conn);

mysql_query("set names 'utf8'");

echo "数据库连接成功";

?>

Mysqli连接:

$conn = mysqli_connect('localhost', 'root', '', 'bbs');

if(!$conn){

die("数据库连接错误" . mysqli_connect_error());

}else{

echo"数据库连接成功";

}

?>

Pdo连接:

try{

$pdo=new pdo("mysql:host=localhost;dbname=bbs","root","");

}catch(PDDException $e){

echo"数据库连接错误";

}

echo"数据库连接成功";

?>

普通的mysql方法在安全性方面应该不是很好,每次需要考虑sql注入的问题,而且速度不是很赞。而mysqli是在mysql基础上进行改进的一次,较好的解决了sql注入问题。

pdo则是最新的数据库抽象方法,pdo高度抽象了数据库操作,项目使用pdo方法可以方便的进行迁移,在不同的数据库之间进行迁移。

在高负载的情况下.PDO开启长连接能够得到一个相对稳定的负载“值”。但是效率却不是最高的。 mysql最快。mysqli其次。只是mysql和mysqli在高并发、系统高负载的时候。其所承担的负载也是很可观的。PDO则不会。书写风格面向对象抛异常

php_mysqli函数名用下划线,比如fetch_all可以oop,也可以opp否,只能false

pdo函数名用驼峰,比如fetchAlloop可以throw,也可false或false加warnnig

php_pgsql函数名用下划线,比如pg_fetch_allopp否,只能false

其次pdo是面向对象的,当有错误的时候可以抛出异常,而且可以自定义异常抛出。

php_mysqli 与 pdo 性能对比:(查找自互联网)PHP的mysqli扩展PDO (使用PDO MySQL驱动和MySQL Native驱动)PHP的mysql扩展引入的PHP版本5.05.03.0之前

PHP5.x是否包含是是是

MySQL开发状态活跃在PHP5.3中活跃仅维护

在MySQL新项目中的建议使用程度建议 - 首选建议不建议

API的字符集支持是是否

服务端prepare语句的支持情况是是否

客户端prepare语句的支持情况否是否

存储过程支持情况是是否

多语句执行支持情况是大多数否

是否支持所有MySQL4.1以上功能是大多数否

PDO使用说明:

PDO::prepare()

官方文档:http://www.php.net/manual/zh/pdo.prepare.php

适用:多次查询使用相同的条件字段和结果字段。这时候比PDO::query()性能高。

转义:value无需手动转义,PDO会自动进行转义,不用担心SQL注入。(开启query log可以看到语句的确已转义)

缺点:由于标识符(列名表名)是手写的SQL,要自己加引用符反勾号`。

PDO::prepare()模拟处理的时候不会通过数据库,所以不知道语法错误,不会返回错误或抛异常。什么时候是真处理,什么时候是模拟处理, 官方手册中未找到说明。输入任意的SQL都不出错……所以目前不要指望prepare返回错误,PDOStatement::execute()时才会返 回错误。

可以用以下代码测试对比mysql数据库的执行效率

/**

* 测试pdo和mysqli的执行效率

*/

header("Content-type:text/HTML;charset=utf-8");

//通过pdo链接数据库

$pdo_startTime = microtime(true);

$pdo = new PDO("mysql:host=localhost;dbname=test","root","1234",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES'utf8';"));

for($i=1;$i<=100;$i++){

$title = "pdo标题".$i;

$content = "pdo内容".$i;

$addtime = time();

$user_id = $i;

$pdo_sql = "INSERT INTO `article`(`title`,`content`,`addtime`,`user_id`) VALUES(:title,:content,:addtime,:user_id)";

$sth = $pdo->prepare($pdo_sql);

$sth->bindParam(':title',$title);

$sth->bindParam(':content',$content);

$sth->bindParam(':addtime',$addtime);

$sth->bindParam(':user_id',$user_id);

$sth->execute();

}

$pdo_endTime = microtime(true);

$pdo_time = $pdo_endTime - $pdo_startTime;

echo $pdo_time;

echo "


";

//通过mysql链接数据库

$mysqli_startTime = microtime(true);

$mysqli = mysqli_connect("localhost","root","1234","test") or die("数据连接失败");

mysqli_query($mysqli,"set names utf8");

for($i=1;$i<=100;$i++){

$title = "mysqli标题".$i;

$content = "mysqli内容".$i;

$addtime = time();

$user_id = $i;

$sql = "INSERT INTO `article`(`title`,`content`,`addtime`,`user_id`) VALUES('".$title."','".$content."',".$addtime.",".$user_id.")";

mysqli_query($mysqli,$sql);

}

$mysqli_endTime = microtime(true);

$mysqli_time = $mysqli_endTime - $mysqli_startTime;

echo $mysqli_time;

echo "


";

if($pdo_time > $mysqli_time){

echo "pdo的执行时间是mysqli的".round($pdo_time/$mysqli_time)."倍";

}else{

echo "mysqli的执行时间是pdo的".round($mysqli_time/$pdo_time)."倍";

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值