严格来说,从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
答案 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()都没有任何意义。
严格来说从一般性能来看,没有丝毫差异。从应用程序设计,敏感性和可读性的角度来看,您可以使用更适合您的任何内容。