PHP+MySQL のバッファされたクエリとバッファされていないクエリ

WBOY
リリース: 2016-06-20 12:41:58
オリジナル
981 人が閲覧しました

http://php.net/manual/zh/mysqlinfo.concepts.buffering.php
http://php.net/manual/zh/mysqli.query.php
PHP MySQL クエリ (mysqli、pdo_mysql) はデフォルトでバッファリング モードを使用します。
つまり、クエリ結果は一度に MySQL から PHP プロセス メモリに転送されます。結果セット内の行数をカウントしたり、結果を移動したりできます。
バッファー モードでは、結果セットが大きい場合、
結果セットが完成するまで、PHP プロセスも大量のメモリを占有します。

store_result はバッファ モードで使用され、すべての結果が PHP プロセスに一度に保存されます:
mysqli::query MYSQLI_STORE_RESULT
mysqli::store_result
mysqli_stmt ::store_result
PHP の MySQL データベース ドライバーが最下層として libmysqlclient を使用する場合、memory_limit は結果セットによって占有されるメモリにカウントできません。
結果セットが PHP 変数に割り当てられていない限り、メモリ制限はカウントされません。最下層が mysqlnd をドライバーとして使用する場合にカウントされます (PHP は、5.4 以降、デフォルトで mysqlnd を最下層として使用します)。
バッファなしモードで実行されます。クエリはリソース参照を返し、MySQL のクエリ結果は PHP を待機します。
非バッファー モードでは、PHP プロセスが使用するメモリはほとんどありませんが、MySQL サーバーの負荷が増加します。
PHP での取得 すべての結果が利用可能になるまで、他のクエリ リクエストは送信できません。現在のデータベース接続。

use_result はバッファされていないクエリを示します。
mysqli::query MYSQLI_USE_RESULT
mysqli::use_result

概要 :
結果セットが大きくない場合、または、すべての行を読み取る前に結果セットの行数を取得する必要がある場合は、バッファリングされたクエリを使用します (デフォルト)。
結果セットが大きい場合は、PHP プロセスが大量のメモリを消費するのを避けるために、バッファリングされていないクエリを使用します。 🎜>$rs = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); ;query("SELECT * FROM City");

デフォルトでは、mysqli_stmt の SELECT クエリ結果は MySQL サーバーに残り、フェッチ メソッドがレコードを 1 つずつ PHP にフェッチするのを待ちます。
すべてのレコードを処理する必要がある場合は、mysqli_stmt::store_result を呼び出して、すべての結果を一度に PHP プログラムに転送できます。
これを実行します。より効率的で、MySQL サーバーの負荷を軽減できますが、より多くのメモリを使用します。
SELECT ステートメントによって見つかったレコードの数を取得するには、mysqli_stmt::$num_rows を使用します。 🎜>この属性は、mysqli_stmt が事前に実行されている場合にのみ使用できます。::store_result メソッドは、すべてのクエリ結果が PHP プログラムに返される場合にのみ使用できます。
mysqli_result::$num_rows と比較すると、この制限はありません。
mysqli_stmt::free_result を使用して mysqli_stmt::store_result();
echo $stmt->num_rows; );

http://php.net/manual/zh/mysqli-stmt.fetch.php
mysqli_stmt::store_result は mysqli_stmt::fetch をより効率的にすることができますが、明示的に行う必要もあります
mysqli_stmt::get_result で結果セット オブジェクト $result を取得し、mysqli_result::fetch_all でクエリ配列 $results を取得します。
$result = $stmt-> get_result();
$results = $result->fetch_all(MYSQLI_ASSOC);

http://php.net/mysqli
mysqli::query SQL を実行し、mysqli_result を正常に返します。 、SHOW、DESCRIBE 操作) オブジェクトまたは TRUE (その他の操作)、FALSE を返すのに失敗します。mysqli: : Close Close を使用します。
MYSQLI :: Prepare Pre-process SQL、ステートメント オブジェクトを正常に返しますが、false を返すのに失敗します。
mysqli_stmt :: SQL を実行します。mysqli_stmt :: close を使用して閉じます。
mysqli_stmt :::: store_result を取得します。すべてのクエリ結果 (SELECT、SHOW、DESCRIBE、EXPLAIN) を PHP に送信します (オプション)。
mysqli_stmt::bind_result prepare および実行によって生成された構造体を変数にバインドし、mysqli_stmt:: を使用してこれらの変数に値を出力または代入します。
mysqli_stmt::fetch を返します。毎回結果セットを作成し、それを mysqli_stmt::bind_result によってバインドされた変数に割り当てます。
mysqli_stmt::get_result 結果オブジェクトを取得し、mysqli_result を呼び出します。:fetch_all は、mysqlnd で使用可能な結果セット配列を返します。 ::fetch_all mysqli_result::close で閉じられた結果セット配列 (MYSQLI_NUM (デフォルト)、MYSQLI_ASSOC、MYSQLI_BOTH) を返します。
mysqli_result::fetch_array は、毎回結果セットの 1 つの項目を返します。 -次元の数値配列と連想配列。
mysqli_result::fetch_assoc は、毎回結果セットの 1 つの項目を返します。これは 1 次元の連想配列です。
mysqli_result ::fetch_row 結果セットの 1 行を返します。時間、つまり 1 次元の数値配列

出典: http://my.oschina.net/eechen/blog/591426


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート