【问题标题】:MySQL & PHP PerformanceMySQL 和 PHP 性能
【发布时间】: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


【解决方案1】:

mysql_query,传统方式由于其简单性而有其自身的优势。 mysqli有它自己的地方。

这取决于mysql数据库是如何设计的,因此速度也取决于它。

如果您需要多次连接到您的数据库,最好使用 mysqli,因为它不会从单个主机对您的数据库进行多重连接,而 mysql_query 传统方式会建立多个连接,这可以达到数据库主机的最大连接数限制。但是是的,连接越多,工作就越快。

【讨论】:

  • 我想知道它是不是由某种随机文本生成器生成的。
  • 经验丰富。我只是分享我的经验。当我使用 mysql_query 时,我从主机收到错误“您已达到最大 mysql 连接数”,但是当我使用 mysqli 时,我没有收到任何此类错误(在相同的代码中)。
  • 那是非常有趣的经历:)
猜你喜欢
  • 2014-02-25
  • 1970-01-01
  • 2017-01-27
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多