実行時間の長いページ用にロードされた進行状況バーを構築しようとしています (はい、インデックスは明らかな解決策ですが、現在、データセット/スキーマはパーティション分割/適切なインデックス作成を禁止しています)。そのため、クエリ コメント内で GUID/uniqueID を使用して、SHOW_FULL_PROCESSLIST で進行状況を追跡する予定です。 ajax経由-しかし、これの鍵は、順次クエリがphpによって順番に実行されるかどうかにかかっています。誰か知っていますか?
3 に答える
データベース サーバーとしての MySQL は、複数のスレッドを使用して複数の実行中のクエリを処理します。PHP接続やODBC接続など、クライアントからクエリを受信したときにスレッドを割り当てます。
ただし、mysql_query について言及したので、次の 2 つのことが考えられると思います。
mysql_query() を複数回呼び出してさまざまなコマンドを渡すと、前のクエリが完全に実行され、結果が PHP に返された後で、MySQL に各クエリが渡されます。したがって、もちろん MySQL は順次動作しているように見えますが、実際には PHP が MySQL へのクエリの送信を 1 つのクエリが完了するまで待機しています。
MySQL5 と PHP5 には ( ) と呼ばれる関数があり、
mysqli_multi_query()
これを使用すると、PHP が 1 つのクエリが終了するのを待たずに、一度に複数のクエリを MySQL に渡すことができます。この関数は、すべての結果を一度に同じ結果オブジェクトに返します。MySQL は実際には複数のスレッドを使用して一度にすべてのクエリを実行し、この場合の待機時間は大幅に短縮されます。また、すべてのクエリが個別のスレッドとして実行されるため、利用可能なサーバー リソースをより有効に使用する傾向があります。
バベッジはかつてこう言った。への呼び出しはmysql_query
、他の関数への呼び出しと同様に、プログラム フローで到達した順序で実行されます。
ファイル内の順序はほとんど関係ありません。重要なのは実行順序です。
<?php
myCmdFour();
myCmdTwo();
myCmdThree();
myCmdTwo();
function myCmdTwo() {
mysql_query(...);
}
function myCmdThree() {
mysql_query(...);
}
function myCmdFour() {
mysql_query(...);
}
myCmdFour();
myCmdThree();
myCmdTwo();
myCmdTwo();
?>
そのような PHP ファイルを持っている人は、真剣に考え直す必要があります。