【问题标题】:Mysqli fetch_assoc() loop vs. Mysqli fetch_all() database load?Mysqli fetch_assoc() 循环与 Mysqli fetch_all() 数据库负载?
【发布时间】:2013-10-05 15:07:12
【问题描述】:

严格从 MySQL 的角度来看(数据库性能,而不是 PHP 性能)在检索查询结果时,Mysqli fetch_assoc() 循环与 Mysqli fetch_all() 之间有什么区别?

假设$result = $qdb->query("SELECT name, id FROM cats");

换句话说,每次额外的 fetch_assoc() 或 fetch_array(MYSQLI_NUM) 迭代会导致更多的 MySQL 通信,还是一次已经从 MySQL 中提取了整个查询结果?

换句话说,Mysqli fetch_all() 可以让 MySQL 的生活更轻松吗?

强调一下,我只关心 MySQL 听到和响应的内容,如果有任何区别的话。这不是关于 PHP 性能的问题,为什么一种方法比另一种更好等等。另外,这不是 PDO 问题http://php.net/manual/en/mysqli-result.fetch-all.php

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    严格从 MySQL 的角度来看(数据库性能,而不是 PHP 性能),Mysqli fetch_assoc() 和 Mysqli fetch_all() 都没有任何意义。

    严格从一般性能来看,并没有丝毫差异。从应用程序设计、敏感性和可读性的角度来看,您可以使用任何更适合您的东西。

    【讨论】:

    • 我不是在问重要性。这两种方法都必须与 MySQL 通信。如果我要监视 MySQL 的两种方法,两种方法的通信是否相同?如果答案是肯定的,那意义重大。如果答案是否定的,那也很重要。为什么?因为“fetch_all”意味着您一次从 MySQL 获取整个结果,而不是分阶段。如果您说 fetch_assoc() 和 fetch_array() 总是获取整个结果(“全部”),我会说知道这一点很重要。如果已经以任一方式获取了整个结果,那也很重要。
    • 这无关紧要,因为此时您不会遇到任何一个功能引起的性能问题。你最好专注于实际问题,而不是想象中的问题。
    • 我如何更好地度过我的空闲时间与你无关。询问 Mysqli 如何在幕后工作是完全合理的。如果你不同意,那是你的问题。坦率地说,我觉得你不屑一顾的态度很粗鲁。
    【解决方案2】:

    通过阅读代码,mysqli_fetch_assoc() 获取一行。

    而 mysqli_fetch_all() 调用 mysqlnd_fetch_all(),它使用循环一次获取一行,直到所有行都被获取,然后退出循环。

    这里是mysqlnd中的相关函数,编辑了长度:

    MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC)
    {
        ...
        do {
                MAKE_STD_ZVAL(row);
                mysqlnd_fetch_into(result, flags, row, MYSQLND_MYSQLI);
                if (Z_TYPE_P(row) != IS_ARRAY) {
                        zval_ptr_dtor(&row);
                        break;
                }
                add_index_zval(return_value, i++, row);
        } while (1);
        ...
    }
    

    所以答案是:从 MySQL 服务器的角度来看,不存在“获取全部”这样的东西。 PHP 扩展要么获取一行,要么一次获取一行,直到获取结果集中的所有行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 2010-11-07
      • 1970-01-01
      • 2019-08-25
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多