MySQLでの(Webアプリ用の)DB接続のオープンとクローズがCPUをどれだけ集中させるか
DB接続ごとに割り当てられているメモリの量について考えます。割り当てなければならないものは何ですか? MySQL 5.0 Certification Study Guide、page 357 によると:
サーバーは、クライアント接続ごとにいくつかのバッファーを維持します。 1つは、クライアントと情報を交換するための通信バッファーとして使用されます。他のバッファは、テーブルを読み取り、結合およびソート操作を実行するためにクライアントごとに維持されます。
接続ごとのバッファを管理する設定は何ですか?
接続が開始されると、これらのバッファの割り当てと割り当て解除に時間がかかります。これらの値の合計に max_connections を掛けることを忘れないでください。補足として、 mysql_pconnect as PHPとMySQLの永続的な接続がうまく機能していません。このトピックに関する2つの有益なリンクを次に示します。
OLTPなどの読み取りが多く、書き込みが多い環境では、RAMの使用と、OSでのスワッピングが原因で発生する可能性のある抑制という点でコストがかかります。低書き込み、低読み取りのWebサイトでは、私はそれほど心配しません。
それが「どれだけ多くの費用がかかる」かが重要であるかどうかはわかりません。同じ接続を再利用するよりも確かにコストがかかります。観察される内容は、接続プーリングを正しく使用しているかどうか、プールの飽和状態、ボックスで使用可能なリソースなどによって異なります。
一般に、データベースを操作するためにループを実行している場合は、同じアクティブな接続を再利用することでfarの方が良いでしょうループ内で開閉すること(私がよく目にするアンチパターン)。
オブジェクトの再利用と破棄と再構築(どちらにも長所と短所があります)の間のジレンマは、多くの場合、妥協策として対処できます。オブジェクトが頻繁にアクセスされる場合、オブジェクトは再利用され続けます。ただし、しばらく使用しない場合は、有効期限メカニズムによって破棄され、もう一度必要になったときに強制的に再作成されます。
システムは、メモリが少ないときに呼び出されるこれらの種類のキャッシュに対してグローバルフックを持つことができます。これにより、最近使用されていないオブジェクトがすべて削除されます。
Mysqlは、スレッドキャッシュ(thread_cache_size)を使用して接続(またはスレッド)をキャッシュします。その最大値は100です。クライアントが接続を閉じると、キャッシュに戻されます。新しい接続が開くと、スレッドキャッシュがチェックされます。非常にビジーなシステムでは、クローズしている接続を開くと、クエリを長時間実行している場合は特に、コストがかかる可能性があります。
https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html Mysql Enterpriseを購入できる場合は、Mysql 5.6に実装されているスレッドプールプラグインを使用できます。