【发布时间】:2014-05-20 20:24:45
【问题描述】:
我有一个关于 mysql_query(我知道它已被弃用并且很快就会过时)和 mysqli 之间的差异以及我注意到的相对性能差异的问题。
所以尽可能简单地说 - 我在 PHP 5.4 中从头开始开发了一个 API,我使用 MySQL v5.0.96,在四核 3.0GHz 的 LAMP 服务器(centos、apache、mysql、php)上运行, 16GB 内存,100mbps 双工连接...真正的标准服务器。
从 POSTMAN 对 API 进行初始调用(如果您不知道的话,这是一个很棒的应用程序 - 这是一个值得一看的 google chrome 扩展程序)平均需要 160 毫秒,考虑到我在另一边世界,并且必须做一些身份验证检查,其余的我并不太在意,但真正让我震惊的是下面两组代码之间的性能差异:
调用 + 55 数组的返回结果在我的索引表中使用 mysqli 如下:
$mysqli = new \mysqli("127.0.0.1", "username", "password", "database", 3306);
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$result = $mysqli->query("SELECT id, name FROM products ORDER BY id");
$rows = array();
while($row = $result->fetch_row()) {
$rows[] = $row;
}
return $rows;
上面的 mysqli 平均需要 850 毫秒,有些峰值在 1000 毫秒,有些低点在 650 毫秒
相比之下,我之所以这样做是因为我认为返回一个包含 55 条记录的数组似乎非常高,我决定使用带有以下代码的老式 mysql_query(是的,我知道 - 已经过时等...) ,你会注意到我一直小心翼翼地复制两者,尽可能地使用不同的方法。
$con = mysql_connect("127.0.0.1","username","password");
if (!$con){ die('Could not connect: ' . mysql_error()); }
mysql_select_db('database', $con);
$row = array();
$result = mysql_query("SELECT id, name FROM products ORDER BY id");
while($rows = mysql_fetch_assoc($result)) {
$row[] = $rows;
}
return $row;
mysql_query 平均耗时 220 毫秒,有些高点是 300 毫秒,有些低点是 180 毫秒
有谁能指出我为什么原来的 mysql_query 比新的 mysqli 快四倍?我无法理解为什么会发生这种情况......我很想知道我是否在 mysqli 上做错了什么,或者只是一个奇怪的观察?当然,更新通常意味着更好,因此更好意味着更快/更准确,所需的计算能力更少?
【问题讨论】:
-
查看 XDebug 和分析 (xdebug.org/docs/profiler) 以检查实际需要时间。
-
更好!== 更快....速度不是唯一可能的改进;使用准备好的语句/绑定变量的能力是一项重大改进,这使得 MySQLi 比其前身好很多......这对性能和安全性都有积极的好处
-
@MarkBaker 差别太大了,不能发表这样的布道。 特定的 mysqli 实例执行如此缓慢有一个明显的技术 原因。当然,通常 mysqli 的表现还不如以这种方式进行防御
-
嗨@hank 我会看看那个-谢谢! @ MarkBaker - 哦,不要误会我的意思 - 我喜欢一些新功能,是的,更好并不总是更快,并且在过去 3 年左右一直在使用 mysqli(在那之前用 PDO 花了一段时间,但我没有不太喜欢)。我第一次处理 10,000 多条记录并经常超时...... @YourCommonSense - 我认为你已经一针见血了,这就是为什么我认为我会把问题放在那里 - 也许有人有一个明确的削减答案,或者我只是做错了什么?虽然 SQL 真的很简单...
-
你在测试之间清除了mysql缓存吗?
标签: php mysql sql performance mysqli