Architecture
ということでさっそく.電車の中で読んでいて改めてはっとした話.自分が知らな過ぎなのかもしれんけど.
10.4 How MySQL Uses Disk Spaceより
- databaseごとにディレクトリを持つ.
- どのテーブルもストレージエンジンに寄らず .frm ファイルを持つ.Table format file.
- MyISAMではfrmファイルに加えて,データ用のファイルとインデックス用のファイルを各テーブルごとに持つ.データ用がMYDファイルでインデックス用がMYIファイルかな?
- InnoDBでは各テーブルごとに作られるのはfrmファイルのみ.全体で共通のデータファイルが一つとログファイルが2つ作られる.
# そういや以前受けたオフィシャルセミナーで出てきたな.すっかり忘れてるし.
10.5 How MySQL Uses Memoryより
スレッドハンドラという仕組みがあるらしい.MySQLでは1接続につき1スレッドを対応させるわけだけど,実はこのスレッドハンドラが,使い終わったスレッドを再利用しているようだ.使用後のスレッドをキャッシュする領域があって,そこがいっぱいになっていない限りスレッドの破棄は行われずに再利用される.この仕組みはパフォーマンス向上のために実装されている.
# これって接続プーリングのマルチスレッド版?
また権限テーブル、インデックスファイルは通常メモリ上にキャッシュされている.頻繁に使われるテーブルもキャッシュされる.他にはクエリキャッシュや権限確認のために使用されるホスト名とIPの対応についてのキャッシュなどが使用されている.
InnoDBではトランザクションの実行中,ログはメモリ上で管理されている.Commitされるとまずログがディスクへ書き出され,それからデータがディスクへ反映される.ログをディスクへ書き出すことさえできれば,障害が発生してデータの書込みに失敗しても更新が失われない.またRollbackが発生した場合にはメモリ上のログを消すだけでよい.
また各接続ごとのキャッシュ領域というのもある.
HEAPではデータもメモリ上.
クエリ実行時に,データベース内部で一時テーブルが作成されるときがある(一時テーブルはもちろんメモリ上).一時テーブルのサイズが変数tmp_table_sizeを超えると,一時テーブルはMyISAM型に変更されてディスクに書き出される.
# なるほどcreate temporary tableのススメの話が以前あったけど,実際にデータベース内部でも活用されてるわけね.