以下の一覧は、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.

