+ -
当前位置:首页 → 问答吧 → 针对“不要做愚蠢+OUT的程序员……”的测试,mysql基本连接,mysqli,pdo,adodb,pearDB间的区别,速度测试

针对“不要做愚蠢+OUT的程序员……”的测试,mysql基本连接,mysqli,pdo,adodb,pearDB间的区别,速度测试

时间:2010-07-29

来源:互联网

早晨无聊进论坛看了下,这篇文章看后“不要做愚蠢+OUT的程序员。抛弃传统数据库连接方式 ”,委实来火,通篇扯淡,误人子弟,贻害大方,更好笑者,跟帖附和者胜多。
现转帖一篇,以供大家求证。

mysql基本连接,mysqli,pdo,adodb,pearDB之间的区别,速度测试。

测试了一下mysql基本连接,mysqli,pdo,adodb,pearDB这几个的速度,结果如下:
用火狐测试1000次查询:

mysql基本连接: 2.26953577995
mysql基本连接: 2.18697500229
mysql基本连接: 1.75704884529
mysql基本连接: 2.14706707001
mysql基本连接: 1.51761412621
mysql基本连接: 1.7188680172
mysql基本连接: 2.32342600822
mysql基本连接: 1.34252810478
mysql基本连接: 1.45732498169
mysql基本连接: 3.65399098396
10次总共时间: 20.3743789196
最快的时间: 1.34252810478

mysqli: 2.35137701035
mysqli: 2.01316308975
mysqli: 1.98780703545
mysqli: 2.21229410172
mysqli: 2.24351000786
mysqli: 1.49605917931
mysqli: 2.17403697968
mysqli: 2.6106979847
mysqli: 2.58286499977
mysqli: 3.17641019821
10次总共时间: 22.8482205868
最快的时间: 1.49605917931

pdo: 1.90496611595
pdo: 3.74309897423
pdo: 1.86429619789
pdo: 3.76973009109
pdo: 3.53142094612
pdo: 2.90672111511
pdo: 1.9796090126
pdo: 2.14065814018
pdo: 2.19515609741
pdo: 2.10665798187
10次总共时间: 26.14231467245
最快的时间: 1.86429619789

adodb: 2.5019569397
adodb: 2.61657714844
adodb: 2.92435717583
adodb: 2.80851197243
adodb: 2.60950493813
adodb: 2.54582691193
adodb: 2.11301803589
adodb: 2.50546598434
adodb: 2.60761213303
adodb: 2.22149610519
10次总共时间: 25.45432734491
最快的时间: 2.11301803589

pearDB: 4.00152897835
pearDB: 4.18637084961
pearDB: 4.05423617363
pearDB: 4.27408695221
pearDB: 3.83169102669
pearDB: 4.07294511795
pearDB: 4.41416597366
pearDB: 4.13296508789
pearDB: 4.28273415565
pearDB: 4.09678888321
10次总共时间: 41.34751319885
最快的时间: 3.83169102669

再次以火狐测试10000次查询:
mysql基本连接: 21.663392067
mysqli: 20.0792491436  
pdo: 30.829996109
adodb: 27.3853821754
pearDB: 40.922711134

mysql基本连接: 18.972700119
mysqli: 19.537981987
pdo: 20.9608280659
adodb: 24.1204249859
pearDB: 38.7300019264

得出结论:
mysql和mysqli速度基本差不多,或者是mysql略快;
pdo和adodb速度差不多,比mysql和mysqli要慢一些;
pearDB最慢。

那么,实现开发中,我们该用哪个好呢?
从运行效率的角度来说,当然是用mysql基本连接或mysqli了。mysql基本连接是一堆函数,有一些功能如取得二维数据之类等可能需要自己去封装。mysqli是php的扩展,是一个预定义类,功能强,使用方便,但有的服务器上可能没有安装mysqli扩展。
pdo同mysqli一样是php的一个扩展,有的服务器可能也没有安装pdo,而且比mysqli略慢,所以一般不推荐使用。选择pdo不如选择mysqli。
adodb是php写成的,不需要安装额外的扩展,可以操作多种数据库。所以如果你的系统可能会改变数据库或涉及到多种数据库,可以用adodb。但一般实际开发中都是确定的一个数据库,所以也不建议使用。
pearDB最慢,也看不出来有什么特别的优点,不推荐使用。

最终结论:

可用mysql基本连接,自己封装成类。特别是开源程序,因为不确定服务器是否可以支持mysqli,应使用mysql基本连接。
特定的项目,有自己的服务器,可以自行安装mysqli扩展,推荐使用mysqli。

mysqli在5.3.0时加上了持久连接。


个人见解:
Mysql基本的数据操作函数本省就简单,少且经典,效力又高,自己封装一个简单的MySQL数据操作类比较合适。
现流行的CMS及开源PHP项目中也正是如此做的。

作者: jmone   发布时间: 2010-07-29

哈哈,楼主激动鸟。

作者: mofe   发布时间: 2010-07-29

 

作者: goodluck709   发布时间: 2010-07-29

请问有没有做过超过100,000次的并发测试?这篇文章在网上不知道已经被转载了几次。pearDB在2007年基本已经无人在用了。

不想回敬你其他的。专嚼别人嚼过吐出来的馒头。。有意思么。。哥笑了

引用
用火狐测试1000次查询

....是扯淡么
[ 此帖被cain在2010-07-29 15:45重新编辑 ]

作者: cain   发布时间: 2010-07-29

补充, pear网站上 db明显标注 deprecated, 取而代之的是MDB2,

蛋疼的去测这个呗。

pdo 和 MDB2 都是把数据库访问语言抽象出来了,好处是显而易见的。

用个大循环拼命测试访问速度是没有意义的。

作者: boborabit   发布时间: 2010-07-29

请先搞清楚什么是并发什么是循环。。

100,000次的并发MySQL和MySQLi明显支撑不住(严格地说是MySQL支撑不住-_-)。而PDO却是越发的表现高稳定性的优势!除了速度慢(MySQL和MySQLi早就Die掉了,额,纠正,是高频率的对MySQL进行读写。MySQL支撑不住),在稳定性上占有绝对的优势!
[ 此帖被cain在2010-07-29 12:31重新编辑 ]

作者: cain   发布时间: 2010-07-29

再次补充。www.php.net翻译内容
引用

PDO(PHP Data Objects)是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力;与ADODB和MDB2相比,PDO更高效。目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择。

PHP 6将默认使用PDO来处理数据库,把所有的数据库扩展移到了PECL

作者: cain   发布时间: 2010-07-29

嗯嗯,跟haowubai老师讲的adodb有异曲同工之妙

作者: mofe   发布时间: 2010-07-29

学习了

作者: fym8888   发布时间: 2010-07-29

有点无语,每个数据库都各有各的长处.

作者: mijian   发布时间: 2010-07-29

mysql基本连接,mysqli,pdo,adodb,pearDB之间的区别,速度测试。

用火狐测试1000次查询:
  膜拜..

作者: xiaokai   发布时间: 2010-07-29

不要和我扯并发,单从效率上说,区区PHP二次封装的(注,我这里没有扁那些大名久扬的产品的意思)怎么可能搞得过C写的扩展,并且那些C的扩展都是开源人士千锤百炼的结果

到底都是要链到MySLQ数据库上,中间你再多的并发还是MySQL的查询在做,而发送这个查询到数据库处理中间的效率才是关键所在
如果非要说并发的话,那牵扯的东西可就多的去了,单单你一个上而上层的程序就往并发上扯,那才叫可笑

再说原生态的mysql查询很早前就支持永久链接了,如果涉及并发的话,更胜一筹是没话说的。
[ 此帖被jmone在2010-07-29 18:08重新编辑 ]

作者: jmone   发布时间: 2010-07-29

哥在笑了一个小时之后才来回复。。。。没办法。。因为哥现在才知道什么叫真正的无知。。

哎。。

引用
不要和我扯并发,单从效率上说,区区PHP二次封装的(注,我这里没有扁那些大名久扬的产品的意思)怎么可能搞得过C写的扩展

你写程序就1000次循环就完了是吧...
C扩展。。哎。。无语了。。。你看过MySQL的扩展代码么
mysqli是永远连接函数,mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,理解什么叫进程和线程么?不知道就先去百度一下行么?而PDO的所有底层代码全部重写的,你要是懂C就去看看他的源代码行么?看完了在说行么。。
引用
到底都是要链到MySLQ数据库上

我就不多说了。。上边已经说过了
引用
中间你再多的并发还是MySQL的查询在做
。。。。。。。。。。
引用
再说原生态的mysql查询很早前就支持永久链接了,如果涉及并发的话,更胜一筹是没话说的。

持久连接和“使用同一进程”是一个意思是吧?


哎。。继续笑

作者: cain   发布时间: 2010-07-29

引用

再说原生态的mysql查询很早前就支持永久链接了,如果涉及并发的话,更胜一筹是没话说的。


一段官方的话
引用
The mysql_pconnect() function was designed to provide a mechanism for reducing the cost of establishing and closing connections to the MySQL server. Unfortunately, due to an interaction between the architecture of the Apache server and the architecture of PHP, high traffic on a site that used pconnects could quickly clog up the MySQL server with many unused connections that could prevent many of the active connections from accessing the database.


翻译
引用
mysql_pconnect()函数设计的目的是为了提供一种机制来减少与Mysql服务器建立/断开连接的开销。不幸的是,由于Apache服务器架构和PHP架构之间的相互作用,一个使用长链接的高流量的网站会因为很多没有使用的链接迅速堵塞Mysql服务器,并且导致活跃的链接无法访问数据库。

作者: xiaokai   发布时间: 2010-07-29

来笑一个。。膜拜...

作者: wybwsk   发布时间: 2010-07-29

作者: cain   发布时间: 2010-07-30

作者: zhangyuan86816   发布时间: 2010-07-30

作者: cain   发布时间: 2010-07-30



不好意思,出去逛了一天,才看到回帖
到服务器上巴拉了回mysql_pcontent的代码看了下(mysqli的源码没有找到),mysql_pcontent对链接做了一个暂存的处理,类似于连接池(看来我真的是很无知啊)

简单的构建了一个压力测试环境,两台服务器(Linux操作系统、4核、16G内存),一台只开了mysql服务,一台只有Web服务。
普通机器7台,单机可同时模拟80多的并发访问
测试的内容包括:效率和抗负荷能力。

循环测试的时候,5000次循环;mysql与mysqli差不多,mysql还是稍胜,快了20%左右,比PDO快70倍多
峰值大约110以内时,mysql、mysqli效率不相上下,mysqli比较快,比mysql快10左右、比pdo快近100倍左右
峰值150时,mysql故障,偶尔报错。
峰值接近310时,mysql已经无法打开。mysqli也开始故障
330时,mysqli同样无法打开页面
pdo在一直无恙。

作者: jmone   发布时间: 2010-07-30

草你老母

作者: cain   发布时间: 2010-07-31

PHP6直接默认PDO

作者: 策马江湖   发布时间: 2010-08-26

一个字,牛

作者: element   发布时间: 2010-08-26