を使用するmysql_query
と、Mysqlは実際にクエリをすぐに実行しますか、それとも呼び出すまで待機しますmysql_fetch_*()
か?
つまり、クエリが非常に遅い場合(たとえば、結果に多くのレコードがある場合)、これらの関数のどれが遅くなりますか?:)
mysql_unbuffered_queryのPHP.netマニュアルから、
mysql_unbuffered_query()は、mysql_query()のように結果行を自動的にフェッチしてバッファリングすることなく、SQLクエリクエリをMySQLに送信します。これにより、大きな結果セットを生成するSQLクエリでかなりの量のメモリが節約され、完全なSQLクエリが実行されるまで待つ必要がないため、最初の行が取得された直後に結果セットの作業を開始できます。複数のデータベース接続が開いているときにmysql_unbuffered_query()を使用するには、オプションのパラメーターlink_identifierを指定して、使用する接続を識別する必要があります。
したがって、mysqlの結果が大きいクエリの場合、mysql_query
実行速度は遅くなります。これに使用する必要がありますmysql_unbuffered_query
。
mysql_query
mysql拡張の内部を見てみましょう。
mysql_query
クエリを実行します。返す行(SELECT
、SHOW
などのステートメント)がある場合は、結果をフェッチしてMYSQL_RES
C構造体に格納します。結果をフェッチするかどうかは、 C関数を呼び出すmysql_use_result
かどうかによって異なります。mysql_store_result
後者は結果全体を保存します。mysql_use_result MySQL C APIマニュアルから、
mysql_use_result()は結果セットの取得を開始しますが、mysql_store_result()のように実際には結果セットをクライアントに読み込みません。代わりに、mysql_fetch_row()を呼び出して、各行を個別に取得する必要があります。これにより、クエリの結果が一時テーブルやローカルバッファに保存されずにサーバーから直接読み取られます。これは、mysql_store_result()よりもいくらか高速で、使用するメモリがはるかに少なくなります。
したがってmysql_store_result
、結果全体を読み取りますが、mysql_use_result
しないでください。
これで、に 対応する Cコードmysql_query
は
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
ここでphp_mysql_do_query
呼び出しphp_mysql_do_query_general
、php_mysql_do_query_general
関数内でPHPはmysql_store_resultを呼び出します
if(use_store == MYSQL_USE_RESULT) { //use_store = MYSQL_STORE_RESULT here
mysql_result=mysql_use_result(mysql->conn);
} else {
mysql_result=mysql_store_result(mysql->conn);
}
したがってmysql_query
、クエリをすぐに実行し、結果セット全体をメモリに保存します。したがって、結果セットが大きい場合は遅くなる可能性があります。
関数が呼び出されるとmysql_fetch_*
、行はPHPの内部バッファーからフェッチされ始めます。
を呼び出すと結果が取得されますmysql_query
。mysql_fetch_*
結果オブジェクトの関連部分を返すだけです。
質問に答えmysql_query()
、クエリを実行し、によって使用されるリソースを返しますmysql_fetch_*()
。したがって、mysql_query()は、低速のクエリに対して低速で実行されるものになります。
言われたようにmysql_query
、クエリを実行します。そのため、クエリ自体が遅い場合(複雑な条件や最適化されていない条件などが含まれる場合)、mysql_query
呼び出しには時間がかかります。
クエリは高速ですが、レコードが多すぎるmysql_fetch_all
場合は、すべてのレコードをPHPメモリにコピーする必要があるため、のようなものには時間がかかる場合があります。