次の一覧は、mysqld サーバーでのメモリーの使用方法の一部を示しています。可能な場合は、メモリー使用に関連するサーバー変数名も記載されています。
The キーバッファー (変数
key_buffer_size
)
はすべてのスレッドで共有される。サーバーが使用するこれ以外のバッファーは必要に応じて割り当てられる。項4.5.3. 「サーバーパラメータのチューニング」
を参照してください。
クライアント接続の管理に使用される各スレッドは、スレッド固有の領域をいくらか使用します。次にそれらの領域およびどの変数がサイズをコントロールするかをリストアップします。
スタック (デフォルト 192KB, 変数
thread_stack
)
接続バッファー (変数
net_buffer_length
)
結果バッファー (変数
net_buffer_length
)
接続バッファーと結果バッファー (ともに
net_buffer_length
で与えられるサイズで始まる)
は必要に応じて
max_allowed_packet
まで動的に拡張される。結果バッファーは各
SQL ステートメントの後
net_buffer_length
に縮小される。クエリーの実行中は現在のクエリー文字列のコピーも割り当てられる。
すべてのスレッドで同じベースメモリーが共有される。
スレッドが必要ない場合、それに割り当てられたメモリーはリリースされ、スレッドがスレッドキャッシュに戻るまでシステムに返されます。この場合、メモリーは割り当てられた状態のままです。
MySQL 5.1.4 以前では、圧縮された
MyISAM
テーブルのみがメモリーマップされました。MySQL
5.1.4
以降では、myisam_use_mmap
システム変数はすべての
MyISAM
テーブルに対してメモリーマッピングを可能にするために、1
に設定できます。
テーブルの順次スキャンを行う要求はそれぞれ、read
buffer(変数
read_buffer_size
)
を割り当てる。
レコードを ``ランダムな''
順序で読み取る場合
(ソート後など)、random-read
bufferが割り当てられディスクシークが回避される
(変数
read_rnd_buffer_size
)。
結合はすべて 1
回の受け渡しで実行され、ほとんどの結合は一時テーブルを使用せずに実行される。一時テーブルのほとんどはメモリーベース
(HEAP)
テーブルである。レコード長の大きな一時テーブル
(すべてのカラム長の合計として算出) や
BLOB
カラムが含まれる一時テーブルはディスク上に格納される。
メモリー内の heap テーブルのサイズが
tmp_table_size
を超えた場合、MySQL はディスクベース
MyISAM
テーブルに変更されることで自動的に処理される。この問題を回避するには、tmp_table_size
オプションを mysqld
に設定するか、クライアントプログラムで
SQL オプション
sql_big_tables
を設定することで、一時テーブルのサイズを拡張します。Session System Variables
を参照してください。
ソートを実行する要求のほとんどで、ソートバッファーおよび結果セットサイズに応じた 0 から 2 つの一時ファイルが割り当てられる。Where MySQL Stores Temporary Files を参照してください。
解析および計算のほとんどすべてが、ローカルメモリーストアで実行される。小さいアイテムにはメモリーオーバヘッドが不要で、通常の低速メモリーの割り当ておよび解放は回避される。メモリーは、予測外の規模の文字列の場合のみ割り当てられます。これは、malloc()
および free()
を使用して実行されます。
開かれる MyISAM
テーブルにはそれぞれ 1
回開かれ、データファイルは、同時実行スレッドごとに
1
回開かれる。同時スレッドのそれぞれに対して、テーブル構造、各カラムのカラム構造、サイズ
3 ×
のバッファーが割り当てられます
(N
N
はレコードの最大長、ただし
BLOB
カラムは計算外)。BLOB
カラムは、5 から 8 バイトに
BLOB
データの長さを加算したバイト数を使用する。MyISAM
ストレージエンジンは、内部使用のための追加レコードを
1 つ使用する。
BLOB
カラムがあるテーブルのそれぞれで、大きな
BLOB
値を読み込むためにバッファーが動的に拡張される。テーブルをスキャンする場合は、最大
BLOB
値と同じ大きさのバッファーが割り当てられる。
使用中テーブルすべてのハンドラ構造がキャッシュに保存され、FIFO 形式で管理される。一般にキャッシュには 64 のエントリがある。テーブルが同時に 2 つの実行スレッドで使用されている場合、キャッシュにはそのテーブルのエントリが 2 つ配置される。項4.4.7. 「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
をテストし、メモリーリークがないと判明しています。