9

严格从 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

4

2 回答 2

9

通过阅读代码,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 服务器的角度来看,不存在“fetch all”这样的东西。PHP 扩展要么获取一行,要么一次获取一行,直到获取结果集中的所有行。

于 2013-09-30T21:16:07.820 回答
-3

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

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

于 2013-09-29T20:05:12.670 回答