1

mysqli を使用するために php mysql 関数を使用して古いスクリプトを更新していますが、すでに興味深い質問 ( mysqli_use_result() と concurrency ) を見つけましたが、1 つのことを明確にしていません:

5 人のユーザーが Web ページに接続し、同時に接続し、user1 が巨大な MyIsam データベースから最初にデータを選択したとします (「ユーザー」および「添付ファイル」テーブルへの左結合を持つフォーラム投稿の 15000 レコード)。

PHPスクリプトが結果を取得している間、他のユーザーは結果を取得できませんよね?

また、上記と同じ状況を使用して、user1 が結果を完全に受信すると、「UPDATE set view_count = INC(1)」クエリが送信され、テーブルがロックされていると思いますが、この同じクエリは他のユーザーに対して失敗しますか?

4

2 に答える 2

2

あなたが引用した記事について。これは、これを行うべきではないことを意味します。

mysqli_query($link, $query);
mysqli_use_result($link);

// lots of 'client processing'
// table is blocked for updates during this
sleep(10) 
mysqli_fetch_* .....

このような状況では、そうすることをお勧めします。

mysqli_query($link, $query);
mysqli_store_result($link);

// lots of 'client processing' 
// table is NOT blocked for updates during this
sleep(10) 
mysqli_fetch_* .....

この記事はさらに、2番目のクエリが発行される場合(mysql_use_result()を呼び出した後、クエリから結果をフェッチする前に失敗する)と述べています。これは、接続ごと、つまりスクリプトごとを意味します。したがって、他のユーザーのクエリはこの間に失敗しません。


phpスクリプトが結果を取得している間、他のユーザーは結果を取得できませんね。

いいえ、これは正しくありません。MySQLは、で構成した数の並列接続をサポートしますmy.ini max_connections。同時読み取りはmysqlサーバーによって処理されます。最大接続制限に達してmysqli_connect()が失敗しない限り、クライアントコードはそれについて心配する必要はありません。アプリケーションがこれが頻繁に発生するポイントに達した場合、ほとんどの場合、最初にmysql構成を微調整して、mysqlがより多くの並列接続を許可するようにします。しきい値に達した場合は、レプリケーションやmysqlクラスターなどの試行を使用します。


また、上記と同じ状況を使用すると、user1がその結果を完全に受信すると、「UPDATE set view_count = INC(1)」クエリが送信され、テーブルがロックされます。この同じクエリは他のユーザーに対して失敗しますか?

読み取りと書き込みが同時に行われる場合、これはもちろんパフォーマンスの問題です。ただし、MySQLサーバーがこれを処理します。つまり、mysqlへの接続が機能している限り、クライアントコードはこれを気にしません。負荷が非常に高い場合は、主にマスタースレーブレプリケーションまたはMySQLクラスターを使用します。

于 2013-03-07T13:49:37.973 に答える
0

この同じクエリは他のユーザーに対して失敗しますか?

通常、データベース サーバーは、プレーン テキスト ファイルよりも少しインテリジェントです。
したがって、クエリは失敗しません。彼らは代わりに待っていました。

私は mysqli_use_result() をまったく使用しませんが。すでに結果を取得していないのはなぜですか?

于 2013-03-07T13:57:03.783 に答える