Mysqli fetch_assoc()循环与Mysqli fetch_all()数据库加载?

时间:2013-09-29 19:54:36

标签: php mysql mysqli

严格来说,从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

2 个答案:

答案 0 :(得分:6)

通过阅读代码,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扩展要么获取一行,要么一次获取一行,直到获取结果集中的所有行。

答案 1 :(得分:-1)

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

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