[InterDB] [著者HP] [PREVIOUS][UP][NEXT]

Copyright @ 2009, Suzuki Hironobu @ InterDB


■2-02■ メモリ構造

MySQLサーバが確保する各種バッファ、およびキャッシュについて【図.2-2】に示します(補足 1)。

図.2-2 MSQLのメモリ構造

問い合わせ処理に使用するバッファ群

MySQLは問い合わせ処理(SQL文の実行)のために5つのバッファを使います。ここで`key_buffer'はMySQLサーバにひとつだけ確保され、それ以外の4つのバッファはスレッド毎に確保されます(【表.2-1】参照)。

表.2-1 問い合わせ処理に関するバッファ
配置バッファ説明
全スレッド共有key_bufferインデックスデータを読み込んでスキャンするためのバッファ。ただし、MyISAM型テーブル専用
スレッド毎read_buffer(インデックスが参照している)テーブルデータを読み込んでスキャンするためのバッファ
read_rnd_bufferテーブルデータを(直接)読み込んでランダムスキャンするためのバッファ
sort_buffer'ORDER BY'の処理など、結果の並べ換えに使うバッファ
join_buffer(複数の)テーブルの完全結合を行うバッファ

問い合わせ処理の詳細は2-03,2-04,2-05を参照してください。


テーブルキャッシュ(table_cache)

MySQLは多数のファイルを使ってデータを保存しています(2-06参照)。例えば、デフォルトのストレージエンジンであるMyISAMはテーブル毎に3つのファイルが必要です。
このようにMySQLの構造上、多数のファイルに即座にアクセスしなければならないので、アクセスする度に(システムコールfopen()を実行して)ファイルをオープンするのでなく、'テーブルキャッシュ'に一度オープンしたファイルのファイルディスクリプタをキャッシュすることで、ファイルオープンのオーバーヘッドを削減します。

テーブルキャッシュのサイズはシステム変数`table_open_cache'(バージョン5.0までtable_cache)で設定します。また、FLUSH TABLES文でテーブルキャッシュのデータを消去できます。

通信バッファ(net_buffer)

通信バッファは、クライアントから受信するSQL文や、クライアントへ送信するデータの一時保管場所として使われます。通信バッファはスレッド毎に確保されます。
通信バッファのサイズは可変で、初期状態でシステム変数`net_buffer_length'の値が確保され、データのサイズに応じてシステム変数`max_allowed_packet'の値まで拡大されます(送信後は初期値に戻る)。

クエリキャッシュ(query_cache)

バージョン 4.0.1から、クエリキャッシュ機能がサポートされました。
クエリキャッシュとは、実行されたSELECT文の結果をキャッシュに保存しておき、同じSELECT文が要求された場合は(検索を行わず)キャッシュに保存した結果を返す機能です。

詳細は2-11を参照してください。

スレッドキャッシュ(thread_cache)

スレッドキャッシュについては2-01の解説を参照してください。

InnoDB型テーブル関連

MySQLはInnoDB型テーブルの処理に関し、バッファプール(buffer_pool)を介してテーブルデータに読み書きします。
また、障害時回復用のトランザクションログを書き込むためにログバッファ(log_buffer)を確保しています。

これらの詳細は2-08を参照してください。

また、InnoDB型に関する内部情報を保持する追加メモリプール(additional_mem_pool)も存在します。

補足


(1)ここでは、以降の説明に必要なバッファやキャッシュのみ解説しています。これ以外にも、例えば多重INSERT文のためのバッファ`bulk_insert_buffer'など、多種多様なバッファやキャッシュがサポートされています。
これらについては適宜解説していきます。

なお、MySQLは開発ペースが早いので、新しいバージョンでは本書で解説した以外のバッファやキャッシュがサポートされている可能性があります。


[PREVIOUS][UP][NEXT]