次のリストに、mysqld サーバーがメモリーを使用する方法のいくつかを示します。該当する場合、メモリー使用に関連するサーバー変数の名前も示しています。
すべてのスレッドは
MyISAM
キーバッファーを共有し、そのサイズはkey_buffer_size
変数によって決定されます。サーバーによって使用されるほかのバッファーは、必要に応じて割り当てられます。セクション8.11.2「サーバーパラメータのチューニング」を参照してください。-
クライアント接続の管理に使用される各スレッドは、いくらかのスレッド固有の領域を使用します。次のリストに、これらとそれらのサイズを制御する変数を示します。
スタック (変数
thread_stack
)接続バッファー (変数
net_buffer_length
)結果バッファー (変数
net_buffer_length
)
接続バッファーと結果バッファーはそれぞれ
net_buffer_length
バイトに等しいサイズから開始されますが、必要に応じてmax_allowed_packet
バイトまで動的に拡大されます。結果バッファーは各 SQL ステートメントのあとにnet_buffer_length
バイトに縮小されます。ステートメントの実行中は現在のステートメント文字列のコピーも割り当てられます。 すべてのスレッドで同じベースメモリーを共有します。
スレッドが必要ない場合、それに割り当てられたメモリーが解放され、スレッドがスレッドキャッシュに戻らないかぎり、システムに返されます。その場合、メモリーは割り当てられた状態のままになります。
myisam_use_mmap
システム変数を 1 に設定して、すべてのMyISAM
テーブルのメモリーマッピングを有効にできます。テーブルの順次スキャンを実行する各リクエストは、read buffer (変数
read_buffer_size
) を割り当てます。行を任意の順序で読み取る場合 (たとえば、ソートに続いて)、random-read buffer (変数
read_rnd_buffer_size
) を割り当てて、ディスクシークを避けることができます。-
すべての結合は単一のパスで実行され、ほとんどの結合は一時テーブルも使用せずに実行できます。ほとんどの一時テーブルはメモリーベースのハッシュテーブルです。大きな行長 (すべてのカラム長の合計として算出される) を持つか
BLOB
カラムを含む一時テーブルはディスク上に格納されます。内部インメモリー一時テーブルが大きくなりすぎると、MySQL は、テーブルをインメモリーから、
MyISAM
ストレージエンジンによって処理されるディスク上フォーマットに変更して、これを自動的に処理します。セクション8.4.4「MySQL が内部一時テーブルを使用する仕組み」に説明するように、許可される一時テーブルのサイズを増やすことができます。 ソートを実行するほとんどのリクエストは、ソートバッファーおよび結果セットサイズに応じた 0 から 2 つの一時ファイルを割り当てます。セクションB.5.4.4「MySQL が一時ファイルを格納する場所」を参照してください。
ほとんどすべての解析と計算は、スレッドローカルの再利用可能なメモリープールで実行されます。小さい項目にはメモリーオーバーヘッドが不要であるため、通常の低速メモリーの割り当てと解放が回避されます。メモリーは、予測外に大きな文字列にのみ割り当てられます。
開かれる
MyISAM
テーブルごとにインデックスファイルが 1 回開かれ、データファイルは同時実行中のスレッドごとに 1 回開かれます。同時スレッドごとに、テーブル構造、各カラムのカラム構造、およびサイズ3 *
のバッファーが割り当てられます (ここでN
N
は最大行長で、BLOB
カラムをカウントしていません)。BLOB
カラムには、5 から 8 バイト+BLOB
データの長さが必要です。MyISAM
ストレージエンジンは、内部使用のため 1 つ余分な行バッファーを保持します。BLOB
カラムがあるテーブルごとに、大きなBLOB
値を読み取るためにバッファーが動的に拡大されます。テーブルをスキャンする場合は、最大のBLOB
値と同じ大きさのバッファーが割り当てられます。使用中のすべてのテーブルのハンドラ構造がキャッシュに保存され、FIFO として管理されます。初期キャッシュサイズは、
table_open_cache
システム変数の値から取得されます。テーブルが同時に 2 つの実行中のスレッドによって使用されている場合、キャッシュにはそのテーブルの 2 つのエントリが含まれます。セクション8.4.3.1「MySQL でのテーブルのオープンとクローズの方法」を参照してください。FLUSH TABLES
ステートメントまたは mysqladmin flush-tables コマンドは、使用中でないすべてのテーブルを一度に閉じ、現在実行中のスレッドの終了時に閉じられるように使用中のすべてのテーブルをマークします。これにより、事実上ほとんどの使用中のメモリーが解放されます。FLUSH TABLES
はすべてのテーブルが閉じられるまで戻りません。GRANT
、CREATE USER
、CREATE SERVER
、およびINSTALL PLUGIN
ステートメントの結果として、サーバーは情報をメモリーにキャッシュします。このメモリーは、対応するREVOKE
、DROP USER
、DROP SERVER
、およびUNINSTALL PLUGIN
ステートメントによって解放されないため、キャッシュを発生させるステートメントの多数のインスタンスを実行するサーバーでは、メモリー使用量が増加します。このキャッシュされたメモリーはFLUSH PRIVILEGES
で解放できます。
ps およびその他のステータスプログラムが、mysqld が大量のメモリーを使用していることをレポートすることがあります。これは、さまざまなメモリーアドレス上のスレッドスタックによって発生する可能性があります。たとえば、Solaris バージョンの ps はスタック間の未使用のメモリーが使用されているメモリーとしてカウントされます。これを確認するには、swap -s
で使用可能なスワップをチェックします。いくつかのメモリーリーク検出ツール (市販とオープンソースの両方の) で mysqld をテストしているため、メモリーリークはないはずです。