あなたが引用した記事について。これは、これを行うべきではないことを意味します。
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クラスターを使用します。