我想知道是否有人对这种二分法有任何第一手经验。一些博客说mysql扩展比mysqli快。这是真的?
我只问速度。我知道 mysqli 具有旧扩展中不存在的功能。
在我见过的大多数基准测试中,MySQL 扩展比 MySQLi 快得多。然而,差异是如此之小,以至于这可能不应该成为您在两者之间做出决定的标准。
其他因素使 mysql 和 mysqli 之间的性能差异相形见绌。使用 mod_php 或 FastCGI、像 APC 这样的字节码缓存,或者明智地使用数据缓存来减少数据库命中,比选择 MySQL 扩展对 PHP 脚本的整体性能更有好处。
不要一分钱一分货,一分钱一分货!:-)
“这取决于。”
例如,PHP MySQL vs MySQLi Database Access Metrics和随后的评论指出了两种方式的论点。
如果你有一个成熟的数据库和代码库,做一些测试,看看你的系统有什么用。如果没有,请停止担心过早的优化。
见http://php.net/manual/en/mysqlinfo.api.choosing.php
所有三个扩展的整体性能被认为是大致相同的。尽管扩展的性能只占 PHP Web 请求总运行时间的一小部分。通常,影响低至 0.1%。
PHP 文档对 mysql、mysqli 和 PDO 进行了很好的比较。我知道您只询问了速度,但其他人可能会觉得这很有用。它讨论了选项之间的功能差异。
也许,这可能是做出正确选择的理由 :: The Plot to Kill PHP MySQL Extension
“是的,你没看错。最近,Phillip Olson 向 PHP 内部邮件列表发送了一份提议,在未来的 PHP 版本中取消原有的 PHP MySQL 扩展。”
根据ceejayoz链接的所有 Google 基准测试结果,在所有基准测试中,MySQL 似乎至少比 MySQLi 快一点。我确实建议阅读结果以了解详细信息,但只是想我会发布一些直接回答问题并提高 ceejayoz 答案的内容。
相对于 PHP 编程语言,MySQL 是旧的数据库驱动程序,而 MySQLi 是改进的驱动程序。MySQLi 利用了 MySQL 5 的新特性。
MySQLi 的功能取自 php.net 站点:
除非毫秒很重要,否则不要担心。当然,如果您不需要 mysqli 提供的额外功能,那么只需坚持使用久经考验的 mysql。
<?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 秒。当使用 mysql 或 mysqli 程序时,我以每种不同的样式加载脚本 20 倍,并且两者始终高于 0.001。我将上述脚本加载 20 倍,但低于 0.001 5 倍。
MySQLi与MySQL相比有两个基本优势;准备好的语句是避免 SQL 注入攻击的好方法。其次,MySQL(或 mariaDB)将尽最大努力优化准备好的语句,因此您有可能在那里进行速度优化。使数据库满意而提高速度将大大超过 MySQL 和 MySQLi 之间的微小差异。
如果您正在输入语句,您自己会像SELECT * FROM users WHERE ID=$user_id
数据库一样将其视为一个独特的语句,每个新值为$user_id
. 但是准备好的语句SELECT * FROM users WHERE ID=?
更有可能让数据库执行一些优化/缓存。
但是比较没有实际意义,因为 MySQL 现在已被正式弃用。从马口中:
PHP 5.5.x 中已弃用的功能
ext/mysql 弃用
原来的 MySQL 扩展现已弃用,并且E_DEPRECATED
在连接到数据库时会产生错误。相反,使用MySQLi或PDO_MySQL扩展。