以下の一覧は、mysqldサーバでのメモリの使用方法の一部を示しています。可能な場合は、メモリ使用に関連するサーバ変数名も記載されています。
The キーバッファ(変数
key_buffer_size)はすべてのスレッドで共有される。サーバが使用するこれ以外のバッファは必要に応じて割り当てられる。
項6.5.2. 「サーバパラメータのチューニング」を参照してください。
それぞれの接続はいくつかのスレッド固有領域を使用します。以下にそれらの領域およびどの変数がサイズをコントロールするかをリストアップします。
スタック(デフォルト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に設定できます。
項4.2.3. 「システム変数」.
テーブルの順次スキャンを行う要求はそれぞれ、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_BIG_TABLESを設定することで、テンポラリテーブルのサイズを拡張する。
項12.5.3. 「SET 構文」を参照してください。
MySQL Enterprise.
MySQL Network Monitoring and Advisory
Service購読者はテンポラリテーブルサイズがtmp_table_sizeを超えたときに警告を受けます。実際のテーブル使用に基づいてtmp_table_sizeの最適値のアドバイスを提供します。MySQL
Network Monitoring and Advisory
Serviceの詳細については、http://www-jp.mysql.com/products/enterprise/advisors.htmlを参照してください。
ソートを実行する要求のほとんどで、ソートバッファおよび結果セットサイズに応じた 0 から 2 つのテンポラリファイルが割り当てられる。項B.1.4.4. 「Where MySQL Stores Temporary Files」を参照してください。
解析および計算のほとんどすべてが、ローカルメモリストアで実行される。小さいアイテムにはメモリオーバヘッドが不要で、通常の低速メモリの割り当ておよび解放は回避される。メモリは、予測外の規模の文字列の場合のみ割り当てられ、これは、malloc()および
free()で実行される。
開かれるMyISAMテーブルにはそれぞれ
1
回開かれ、データファイルは、同時実行スレッドごとに
1
回開かれる。同時スレッドのそれぞれに対して、テーブル構造、各カラムのカラム構造、サイズ
3 ×
のバッファが割り当てられる(NNは、レコードの最大長、ただし
BLOBカラムは計算外)。BLOBカラムは、5
から 8 バイトに
BLOBデータの長さを加算したバイト数を使用する。MyISAMストレージエンジンは、内部使用のための追加レコードを
1 つ使用する。
BLOBカラムがあるテーブルのそれぞれで、大きな
BLOB値を読み込むためにバッファが動的に拡張される。テーブルをスキャンする場合は、最大
BLOB値と同じ大きさのバッファが割り当てられる。
使用中テーブルすべてのハンドラ構造がキャッシュに保存され、FIFO 形式で管理される。一般にキャッシュには 64 のエントリがある。テーブルが同時に 2 つの実行スレッドで使用されている場合、キャッシュにはそのテーブルのエントリが 2 つ配置される。項6.4.8. 「MySQL でのテーブルのオープンとクローズの方法」を参照してください。
FLUSH TABLESコマンド(または
mysqladmin
flush-tablesステートメント)によって、使用中でないテーブルすべてが閉じられ、現在実行中のスレッドの終了時に使用中のテーブルすべてが閉じられるように指定される。これで効率的に使用中メモリに空きを作ることができる。
FLUSH
TABLESは全てのテーブルが閉じられるまで返されない。
ps
およびその他のステータスプログラムによって、mysqldが大量のメモリを使用していることを示すレポートが行われることがあります。これは、複数のメモリアドレスでのスレッドスタックによって発生します。たとえば、Solaris
バージョンの
psではスタック間の使用していないメモリが使用メモリにカウントされます。これは、swap
-sで使用可能スワップをチェックすることで検証できます。市販のメモリリーク検出装置で
mysqldをテストし、メモリリークがないと判明しています。
