以下の一覧は、mysqld
サーバでのメモリの使用方法の一部を示しています。可能な場合は、メモリ使用に関連するサーバ変数名も記載されています。
キーバッファ(変数
key_buffer_size
)はすべてのスレッドで共有される。サーバが使用するこれ以外のバッファは必要に応じて割り当てられる。
See 項5.5.2. 「サーバパラメータのチューニング」。
それぞれの接続は、スタック(デフォルト
64K、変数
thread_stack
)、接続バッファ(変数
net_buffer_length
)、および結果バッファ(net_buffer_length
)のスレッド固有領域を使用する。接続バッファと結果バッファは必要に応じて
max_allowed_packet
まで動的に拡張される。クエリの実行中は現在のクエリ文字列のコピーも割り当てられる。
すべてのスレッドで同じベースメモリが共有される。
圧縮 ISAM
および
MyISAM
テーブルのみがメモリにマップされる。これは、4
GB の 32
ビットメモリ領域では大型のほとんどのテーブルに十分なほどは大きくないことによる。64
ビットアドレス領域のあるシステムが一般的になれば、メモリマップの一般サポートの追加が可能になる。
テーブルの順次スキャンを行う要求はそれぞれ、読み取りバッファ(変数
read_buffer_size
)を割り当てる。
レコードを ``ランダムな''
順序で読み取る場合(ソート後など)、ランダム読み取りバッファが割り当てられディスクシークが回避される(変数
read_rnd_buffer_size
)。
結合はすべて 1
回の受け渡しで実行され、ほとんどの結合はテンポラリテーブルを使用せずに実行される。テンポラリテーブルのほとんどはメモリベース(HEAP
)テーブルである。レコード長の大きなテンポラリテーブル(すべてのカラム長の合計として算出)や
BLOB
カラムが含まれるテンポラリテーブルはディスク上に格納される。
バージョン 3.23.2 より前の MySQL
には、メモリ内の HEAP
テーブルが tmp_table_size
のサイズを超えた場合にエラー The
table tbl_name is full
が出力される問題があった。3.23.2
以降、この問題は必要に応じてメモリ内
HEAP
テーブルをディスクベース
MyISAM
テーブルに変更されることで自動的に処理される。この問題を回避するには、tmp_table_size
オプションを mysqld
に設定するか、クライアントプログラムで
SQL オプション BIG_TABLES
を設定することで、テンポラリテーブルのサイズを拡張する。See
項5.5.6. 「SET
構文」。MySQL バージョン 3.20
では、テンポラリテーブルの最大サイズが
record_buffer*16
であった。このバージョンを使用している場合は、record_buffer
の値を拡大する必要がある。また、--big-tables
オプションで mysqld
を起動して、常にテンポラリテーブルをディスクに格納することもできる。ただし、これは複雑なクエリのほとんどで処理速度に影響を及ぼす。
ソートを実行する要求のほとんどで、ソートバッファおよび結果セットサイズに応じた 0 から 2 つのテンポラリファイルが割り当てられる。 See 項A.4.4. 「MySQL がテンポラリファイルを格納する場所」。
解析および計算のほとんどすべてが、ローカルメモリストアで実行される。小さいアイテムにはメモリオーバヘッドが不要で、通常の低速メモリの割り当ておよび解放は回避される。メモリは、予測外の規模の文字列の場合のみ割り当てられ、これは、malloc()
および free()
で実行される。
インデックスファイルはそれぞれ 1
回開かれ、データファイルは、同時実行スレッドごとに
1
回開かれる。同時スレッドのそれぞれに対して、テーブル構造、各カラムのカラム構造、サイズ
3 * n
のバッファが割り当てられる(n
は、レコードの最大長、ただし
BLOB
カラムは計算外)。BLOB
カラムは、5 から 8 バイトに
BLOB
データの長さを加算したバイト数を使用する。ISAM
および MyISAM
ストレージエンジンは、内部使用のための追加レコードを
1 つ使用する。
BLOB
カラムがあるテーブルのそれぞれで、大きな
BLOB
値を読み込むためにバッファが動的に拡張される。テーブルをスキャンする場合は、最大
BLOB
値と同じ大きさのバッファが割り当てられる。
使用中テーブルすべてのハンドラ構造がキャッシュに保存され、FIFO 形式で管理される。一般にキャッシュには 64 のエントリがある。テーブルが同時に 2 つの実行スレッドで使用されている場合、キャッシュにはそのテーブルのエントリが 2 つ配置される。 See 項5.4.7. 「MySQL でのテーブルのオープンとクローズの方法」。
mysqladmin flush-tables
コマンド(または FLUSH TABLES
ステートメント)によって、使用中でないテーブルすべてが閉じられ、現在実行中のスレッドの終了時に使用中のテーブルすべてが閉じられるように指定される。これで効率的に使用中メモリに空きを作ることができる。
ps
およびその他のステータスプログラムによって、mysqld
が大量のメモリを使用していることを示すレポートが行われることがあります。これは、複数のメモリアドレスでのスレッドスタックによって発生します。たとえば、Solaris
バージョンの ps
ではスタック間の使用していないメモリが使用メモリにカウントされます。これは、swap
-s
で使用可能スワップをチェックすることで検証できます。市販のメモリリーク検出装置で
mysqld
をテストし、メモリリークがないと判明しています。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.