3

を使用するmysql_queryと、Mysqlは実際にクエリをすぐに実行しますか、それとも呼び出すまで待機しますmysql_fetch_*()か?

つまり、クエリが非常に遅い場合(たとえば、結果に多くのレコードがある場合)、これらの関数のどれが遅くなりますか?:)

4

4 に答える 4

2

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_querymysql拡張の内部を見てみましょう。

mysql_queryクエリを実行します。返す行(SELECTSHOWなどのステートメント)がある場合は、結果をフェッチしてMYSQL_RESC構造体に格納します。結果をフェッチするかどうかは、 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_generalphp_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の内部バッファーからフェッチされ始めます。

于 2012-12-30T11:46:05.883 に答える
1

を呼び出すと結果が取得されますmysql_querymysql_fetch_*結果オブジェクトの関連部分を返すだけです。

于 2012-12-30T11:40:56.987 に答える
1

質問に答えmysql_query()、クエリを実行し、によって使用されるリソースを返しますmysql_fetch_*()。したがって、mysql_query()は、低速のクエリに対して低速で実行されるものになります。

于 2012-12-30T11:42:06.737 に答える
1

言われたようにmysql_query、クエリを実行します。そのため、クエリ自体が遅い場合(複雑な条件や最適化されていない条件などが含まれる場合)、mysql_query呼び出しには時間がかかります。

クエリは高速ですが、レコードが多すぎるmysql_fetch_all場合は、すべてのレコードをPHPメモリにコピーする必要があるため、のようなものには時間がかかる場合があります。

于 2012-12-30T11:47:34.463 に答える