-2

MySQL のバッファリングされていないクエリは本当に PHP バッファリングをまったく使用しないのでしょうか? また、PHP がデータにアクセスする前に、バッファリングされたクエリは本当に結果セット全体をバッファリングしますか?

MySQL のバッファリングされたクエリについて読んだことから、これは私が望んでいるものではありません。なぜなら、結果の処理をすぐに開始し、開始する前にすべての結果がバッファリングされるのを待つ必要がないからです。しかし、バッファリングされていないクエリについて読んだことから、MySQL が必要以上に長く保持されないようにクライアントで結果をバッファリングしたいので、これは私が望むものではありません。結果の作業を開始する前に、結果が完全にバッファリングされるまで待機させたくありません。だから私が理解するのを手伝ってください。

MySQL/PHP のバッファリングされたクエリは、PHP が結果の使用を開始できるようになる前に、結果セット全体を実際にバッファリングしますか? また、バッファリングされていないクエリは実際にバッファリングをまったく使用しないため、MySQL サーバーは、クライアントに送信される前に PHP が次の結果を要求するのを常に待機していますか? これが本当なら、すぐに結果の使用を開始し、結果をバッファリングして MySQL の負荷を軽減する方法がないのはなぜですか?

私の MySQL サーバーは、多数の異なるクライアント ノードを持つ共有サーバーです。したがって、クライアント側でバッファリングを使用しないのは意味がありません。ただし、クエリは大きいため、結果の使用を開始するために結果セット全体が返されるのを待つ必要はありません。

それで、私はこれを正しく理解していますか?私がここでやりたいことをする方法はありませんか?これを実用的に処理する方法はありませんか?

4

1 に答える 1

1

MySQLが必要以上に長く保持されないように、クライアントで結果をバッファリングしたい

MySQL は同時接続を処理する能力が非常に高く、実際、それらの同時接続からの同時操作も処理できます。これは、ほぼRDBMSの主な存在理由の 1 つです。

同時操作が同じ基本データに作用する場合の競合を防ぐために、MySQL は 1 つの接続を排他的に使用するためにデータベースの一部を「ロック」することがあります。ただし、クライアントへの結果の送信が開始されると、そのステートメントの実行のために取得されたロックはすべて解放されています。したがって、MySQL は、結果セット全体をすぐにバッファにロードしないクライアントによって「停止」されることはありません

それで、あなたの特定の質問に進みます:

  1. MySQL/PHP のバッファリングされたクエリは、PHP が結果の使用を開始できるようになる前に、結果セット全体を実際にバッファリングしますか?

    はい。

  2. また、バッファリングされていないクエリは本当にバッファリングをまったく使用しないので、MySQL サーバーはクライアントに送信される前に PHP が次の結果を要求するのを常に待機していますか?

    かなり。MySQL クライアント ライブラリ (C) は、ある程度のバッファリングを実行しますが、これはネットワーク操作を効率的に実行するためだけです。

  3. これが本当なら、すぐに結果の使用を開始し、さらに結果をバッファリングして MySQL の負荷を軽減する方法がないのはなぜですか?

    バッファリングされていないクエリからの MySQL への「負荷」はほとんどありません。確かに、接続を開いたままにし、結果セットをメモリに保持する必要がありますが、それが非常に大きな問題になることはめったにありません。

于 2015-03-11T04:11:47.317 に答える