PHP-MySQL和MySQLi哪个最快?

Which is fastest in PHP- MySQL or MySQLi?

提问人:David 提问时间:10/5/2008 最后编辑:nickfDavid 更新时间:1/23/2016 访问量:60933

问:

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

我只问速度。我知道 mysqli 具有旧扩展中不存在的功能。

php mysql mysqli

评论


答:

3赞 Jay 10/5/2008 #1

根据 ceejayoz 链接的所有 Google 基准测试结果,在所有基准测试中,MySQL 至少比 MySQLi 略快。我确实建议阅读结果以了解详细信息,但只是想我会发布一些直接回答问题并提升 ceejayoz 答案的内容。

88赞 Bill Karwin 10/5/2008 #2

在我看到的大多数基准测试中,MySQL 扩展比 MySQLi 快得多。然而,差异是如此之小,以至于这可能不应该成为您在两者之间做出决定的标准。

其他因素使 mysql 和 mysqli 之间的性能差异相形见绌。使用 mod_php 或 FastCGI、像 APC 这样的字节码缓存,或者明智地使用数据缓存来减少数据库命中,对 PHP 脚本的整体性能比选择 MySQL 扩展更有利。

不要一分钱一分货,一分钱一分货!:-)

评论

1赞 Drewdin 9/22/2010
那么使用mysql和mysqli最大的区别是什么呢?我被教导只使用mysqli,但从未被告知原因。你能给我一个简短的解释吗?谢谢
1赞 Bill Karwin 9/22/2010
ext/mysqli 支持底层 MySQL API 的更多功能,例如事务和带有参数的预处理查询。此外,您可以以面向对象的方式调用 mysqli 函数。
4赞 Geoffrey 6/3/2013
@Drewdin:mysql扩展已弃用,将在以后的版本中删除。您不应该再使用 mysql 而不是 mysqli。此外,较旧的 mysql 扩展存在字符串转义问题以及更高版本的 MySQL 上的持久连接问题。
1赞 Bill Karwin 6/3/2013
@Geoffrey,是的,如果您正在考虑选择哪个扩展,那么这是一个很好的点,这假定您可以自由切换。现在,在我最初回答这个问题将近五年后,如果项目有任何选择,就不应该考虑mysql扩展。
1赞 Bill Karwin 8/14/2015
@Pacerier,是的,您还可以运行 PREPARE 和 EXECUTE 语句。但是PHP中的mysql API仍然被弃用。
3赞 Don Kirkby 4/9/2009 #3

PHP 文档对 mysql、mysqli 和 PDO 进行了很好的比较。我知道你只问了速度,但其他人可能会觉得这很有用。它讨论了选项之间的功能差异。

10赞 Alkini 12/29/2009 #4

“这要看情况。”

例如,PHP MySQL vs MySQLi Database Access Metrics 和随后的注释都指出了两种方式的参数。

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

1赞 Taylor 2/26/2010 #5

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

3赞 AgelessEssence 7/16/2011 #6

也许,这可能是做出正确选择的理由:: 剧情 杀死 PHP MySQL 扩展

“是的,你没看错。最近,Phillip Olson 向 PHP 内部邮件列表发送了一份提案,要求在未来的 PHP 版本中取消原来的 PHP MySQL 扩展。"

评论

2赞 Jeff_Alieffson 11/25/2013
我测试了。对我来说,旧的 mysql 扩展比 mysqli 扩展更快
0赞 RiggsFolly 8/18/2015
@Jeff_Alieffson 如果不提供一些可测试的指标,这没有多大帮助
3赞 Pank 12/28/2011 #7

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

MySQLi的功能取自 php.net 站点:

  • 面向对象的界面
  • 支持预准备语句
  • 支持多个语句
  • 支持交易
  • 增强的调试功能
  • 嵌入式服务器支持

评论

9赞 Martin Bean 6/23/2013
不知道为什么这被点赞了这么多次。我投了反对票,因为它没有回答实际问题。
3赞 Fedir RYKHTIK 7/4/2013
问题在于速度,而不是美观或附加功能。
0赞 TeAmEr 7/25/2013
我想这应该很重要,即使 MYSQL 比 MySQLi “稍微”快一点,我也不会在 MYSQL 上构建系统,因为它迟早会变得匮乏,因此重写你所有的数据库引擎和任何相关代码!
0赞 Pacerier 10/18/2014
@RonanDejhero,还有PECL。已弃用 != 不可用。
6赞 Gordon 1/17/2012 #8

查看 http://php.net/manual/en/mysqlinfo.api.choosing.php

所有三个扩展的整体性能被认为大致相同。尽管扩展的性能仅占 PHP Web 请求总运行时间的一小部分。通常,影响低至0.1%。

-2赞 Donovanr 6/23/2013 #9

MySQL相比,MySQLi有两个基本优势;准备好的语句是避免 SQL 注入攻击的好方法。其次,MySQL(或mariaDB)将尽最大努力优化准备好的语句,因此您有可能在那里进行速度优化。使数据库满意而带来的速度提升将大大超过MySQL和MySQLi之间的微小差异。

如果你在语句中输入,你自己混在一起,就像数据库会把它当作一个唯一的语句,每个新值都是 。但是,准备好的语句更有可能由数据库执行一些优化/缓存。SELECT * FROM users WHERE ID=$user_id$user_idSELECT * FROM users WHERE ID=?

但比较是相当没有意义的,因为MySQL现在已被正式弃用。从马的嘴里:

PHP 5.5.x 中不推荐使用的功能

ext/mysql 弃用

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

评论

0赞 Your Common Sense 6/23/2013
你可以做到,而且拥有它的速度更快"SELECT * FROM users WHERE ID IN ($user_id, $user_id2)"
1赞 Your Common Sense 6/23/2013
人们也可以用 mysql 制作一个准备好的语句。
0赞 Andrew 1/27/2017
如果在某些时候 SELECT * FROM users WHERE ID=1 已运行,则启用了查询缓存并存储了此查询,然后再次运行它将从缓存中获取此查询,则无论此语句是作为直接查询字符串还是预准备语句生成,这都不准确。
0赞 Josh 12/25/2013 #10
<?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 过程样式一起使用会略有提高?在测试上述脚本时,我得到的 0.0009 秒始终比使用其他 2 个脚本时多。当使用 mysql 或 mysqli 过程时,我以每种不同的样式加载了 20 倍的脚本,并且两者始终高于 .001。我加载了上面的脚本 20 倍,我得到低于 .001 5 倍。

评论

0赞 Andrew 1/27/2017
在一般测试时,我建议使用 SQL_NO_CACHE 来帮助确保查询正在运行。此外,您的测试不是很强大,略微随机的 RAM/硬盘访问性能很容易使结果出现偏差。实际上,需要在相同条件下进行一系列测试,以确保其中一个或另一个具有性能改进。