MySQLで(Webアプリの)DB接続を開いたり閉じたりするCPU集中型の方法
- ... DBソフトウェアがlocalhostにある場合
- ... DBソフトウェアが別のマシンにある場合
MySQLで(Webアプリの)DB接続を開いたり閉じたりするCPU集中型の方法
回答:
DB接続ごとに割り当てられるメモリの量について考えてください。どのようなものを割り当てる必要がありますか?MySQL 5.0認定スタディガイド357ページによると:
サーバーは、クライアント接続ごとにいくつかのバッファーを維持します。1つは、クライアントと情報を交換するための通信バッファーとして使用されます。他のバッファは、テーブルを読み取り、結合およびソート操作を実行するためにクライアントごとに維持されます。
接続ごとのバッファを管理する設定は何ですか?
接続が開始されると、これらのバッファの割り当てと割り当て解除に時間がかかります。これらの値の合計にmax_connectionsを掛けることを忘れないでください。補足説明として、PHPとMySQLの永続的な接続がうまくいかないため、mysql_pconnectの使用を控えてください。このトピックに関する2つの有益なリンクを次に示します。
OLTPなどの読み取りが多く書き込みが重い環境では、これはRAMの使用とOSでのスワッピングによる抑制の観点から高価です。低書き込み、低読み取りのWebサイトでは、それほど心配しません。
それが「どれほど費用がかかる」かがわからない。同じ接続を再利用するよりも確かにコストがかかります。監視する内容は、接続プーリングを正しく使用しているかどうか、プールの飽和度、ボックスで使用可能なリソースなどによって異なります。
一般に、データベースとのやり取りを行うためにループを実行している場合、ループ内で開いたり閉じたりするよりも、同じアクティブな接続を再利用する方がはるかに良いでしょう(アンチパターンはよく見かけます) 。
Mysqlは、スレッドキャッシュ(thread_cache_size)を使用して接続(またはスレッド)をキャッシュします。最大値は100です。クライアントが接続を閉じると、キャッシュに返されます。新しい接続が開くと、スレッドキャッシュがチェックされます。非常にビジーなシステムでは、閉じた接続を開くと、特に実行時間が長いクエリがある場合は高価になる可能性があります。
https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html Mysql Enterpriseを購入する余裕がある場合は、Mysql 5.6に実装されているスレッドプールプラグインを使用できます。