php-Mysqli fetch_assoc()ループとMysqli fetch_all()データベースのロード?
厳密に言えば、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
答え :
解決策:
コードの読み取りから、mysqli_fetch_assoc()は1行をフェッチします。
mysqli_fetch_all()はmysqlnd_fetch_all()を呼び出しますが、mysqlnd_fetch_all()は、すべての行がフェッチされるまでループを使用して一度に1行をフェッチし、その後ループから抜け出します。
これが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()も重要ではありません。
厳密に言えば、一般的なパフォーマンスの観点からは、わずかな違いはありません。 アプリケーションの設計、感度、読みやすさの観点から、自分に合ったものなら何でも使用できます。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。