PHP中哪个更快 - MySQL还是MySQLi?

56

我想知道是否有人对这种二分法有第一手经验。 一些博客说,mysql扩展比mysqli更快。这是真的吗?

而我只是询问速度问题。 我知道mysqli具有旧扩展中没有的功能。

10个回答

88

在我看到的大多数基准测试中,MySQL扩展比MySQLi扩展稍微快一点。然而,差别非常微小,这可能不应该是你在两者之间进行选择时的决定标准。

除了mysql和mysqli之间性能差异之外,其他因素会使差异微不足道。对于PHP脚本的整体性能,使用mod_php或FastCGI、像APC这样的字节码缓存,或者明智地使用数据缓存以减少对数据库的访问,要比选择MySQL扩展更有益。

不要眼前小利而忘了长远大益! :-)


1
使用mysql和mysqli的最大区别是什么?我被教导只使用mysqli,但从未被告知原因。您能给我一个简要的解释吗?谢谢。 - Drewdin
1
ext/mysqli支持更多底层MySQL API的功能,例如事务和带参数的预处理查询。此外,您还可以以面向对象的方式调用mysqli函数。 - Bill Karwin
4
@Drewdin: mysql扩展已经被弃用,并将在以后的版本中删除。您不应再使用mysql,而应改用mysqli。此外,旧版mysql扩展存在字符串转义问题和在MySQL较新版本上存在持久连接问题的情况。 - Geoffrey
1
@Geoffrey,是的,如果你正在考虑选择哪个扩展程序,那么这是一个很好的观点,这意味着你有自由进行切换。现在距我最初回答这个问题已经将近五年了,如果项目有任何选择余地,就不应该考虑使用mysql扩展程序。 - Bill Karwin
1
@Pacerier,是的,你也可以运行PREPARE和EXECUTE语句。但是PHP中的mysql API仍然已被弃用。 - Bill Karwin
显示剩余5条评论

10
"

这要看具体情况。

例如,PHP MySQL与MySQLi数据库访问度量及其后续评论都提出了双方的论点。

如果您拥有成熟的数据库和代码库,请进行一些测试,看看在您的系统中哪种方法更有效。如果没有,请不要担心过早地进行优化。

"

6

3

也许,这可以成为做出正确选择的一个原因:计划杀死PHP MySQL扩展

“是的,你没有看错。最近,菲利普·奥尔森(Phillip Olson)向PHP内部邮件列表提交了一份提案,以在未来的PHP版本中取消原始的PHP MySQL扩展。”


2
我进行了测试。对我来说,旧的mysql扩展比mysqli扩展更快。 - Jeff_Alieffson
@Jeff_Alieffson 如果没有提供一些可测试的度量指标,那么这并没有什么帮助。 - RiggsFolly

3
根据 ceejayoz 提供的基准测试结果,所有谷歌搜索结果显示,在所有基准测试中,MySQL 至少比 MySQLi 稍微快一些。我建议阅读详细结果,但是我想直接回答这个问题并提高 ceejayoz 的回答。请保留 HTML 标签。

3

PHP文档提供了一个很好的mysql、mysqli和PDO比较。虽然你只问到速度,但其他人可能会觉得这个很有用。它详细介绍了这些选项之间的功能差异。


3

关于PHP编程语言,MySQL是旧的数据库驱动程序,而MySQLi是改进的驱动程序。MySQLi利用了MySQL 5的新功能。

从php.net网站获取的MySQLi特性:

  • 面向对象的接口
  • 支持预处理语句
  • 支持多语句
  • 支持事务
  • 增强的调试能力
  • 嵌入式服务器支持

9
不确定为什么这篇文章被投票赞成了这么多次。我会将其投票反对,因为它并没有回答实际问题。 - Martin Bean
3
问题涉及速度,而不是美观或额外功能。 - Fedir RYKHTIK
我想这应该是最重要的事情,即使MYSQL比MySQLi“稍微”快一些,我也不会在MYSQL上构建系统,因为迟早它可能会过时,因此需要重写所有数据库引擎和任何相关代码! - Rami Dabain
@RonanDejhero,仍然有PECL。 Deprecated!=不可用。 - Pacerier

1

除非毫秒很重要,否则不用担心。如果您不需要mysqli提供的额外功能,那么就坚持使用经过验证的mysql。


0
<?php
$start = microtime();
$c = new mysqli('localhost', 'username', 'userpass', 'username_dbname');
$c -> select_db('username_dbname');


$q = $c -> query("SELECT * FROM example");

while ($r = $q -> fetch_array(MYSQLI_ASSOC))
  {
  echo $r['col1'] . "<br/>\n";
  }

$me = $c -> query("SELECT col1 FROM example WHERE id='11'") -> fetch_array(MYSQLI_ASSOC);

echo $me['col1'];
echo (microtime() - $start);
?>

为什么使用mysqli oop时,与mysql或mysqli procedural style相比,脚本速度会略有提高?在测试上述脚本时,我始终比使用其他两种方式多0.0009秒。当使用mysql或mysqli procedural时,我以每种不同风格加载了20次脚本,两者始终在0.001以上。我加载上述脚本20次,其中5次低于0.001。

在进行测试时,我建议使用SQL_NO_CACHE来确保查询正在运行。此外,您所拥有的测试并不是非常健壮的,稍微随机的RAM /硬盘访问性能可能会轻易地扭曲结果。实际上,需要在相同条件下进行一系列测试,以确保其中一个具有性能提升。 - Andrew

-2

MySQLi相比于MySQL有两个基本优点:准备好的语句是避免SQL注入攻击的好方法。其次,MySQL(或mariaDB)将尽力优化准备好的语句,因此您可以在那里获得速度优化的潜力。使数据库满意从而提高速度,远远超过MySQL和MySQLi之间微小的差异。

如果您输入自己拼凑的语句,例如SELECT * FROM users WHERE ID=$user_id,则数据库将将其视为每个新值$user_id的唯一语句。但是,准备好的语句SELECT * FROM users WHERE ID=?具有更好的优化/缓存机会。

但是,比较MySQL和MySQLi实际上没有太大意义,因为MySQL现在已经官方弃用了。引用原话:

PHP 5.5.x中的弃用功能

ext/mysql deprecation

原始的MySQL扩展现已被弃用,并且在连接到数据库时将生成E_DEPRECATED错误。请改用MySQLiPDO_MySQL扩展。


你可以将它写成"SELECT * FROM users WHERE ID IN ($user_id, $user_id2)",这样可以使其运行速度更快。 - Your Common Sense
1
一个人也可以把MySQL制作成预处理语句。 - Your Common Sense
如果在某个时刻运行了SELECT * FROM users WHERE ID=1,而且启用了查询缓存并且该查询已被存储,则无论此语句是作为直接查询字符串还是准备好的语句生成,再次运行它都将从缓存中获取。这可能包含不准确的内容。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接