InnoDBの内部構成
row:
各行データ
page:
各行は16KBのPageに書き込まれる(デフォルト16KB。変更可能)
extent:
Pageは1MBづつextentとして扱われる(デフォルト64 page)
segment:
table spaceにはsegmentがあり、対応するextentが保存される
Index
テーブルへの処理を高速化するためのデータ構造
InnoDBのIndex
インデックスレコードがツリーのリーフページ内に格納される B ツリー構造
__○__ <- ルートノード
/ \
○ ○ <- ブランチノード
/\ / \
○ ○ ○ ○ <- リーフノード
二分探索できるようにソートしたデータが配置される。
__9__ <- ルートノード
/ \
4 15 <- ブランチノード
/\ / \
2 6 12 17 <- リーフノード
クラスタインデックス
データが主キーのリーフノードに格納される
テーブルに対し1つ存在する
__○__ <- ルートノード
/ \
○ ○ <- ブランチノード
/\ / \
○ ○ ○ ○ <- リーフノード ここに行データが入っている
セカンダリインデックス
クラスタインデックス以外のインデックス全て
リーフノードには主キーの値が格納されている
__○__ <- ルートノード
/ \
○ ○ <- ブランチノード
/\ / \
○ ○ ○ ○ <- リーフノード ここに主キーの値が入っている。
セカンダリインデックスを使う場合、ここで一旦主キーの値を取得し、
主キーのクラスタインデックスを走査する
- Covering Index
クエリが要求するデータが全てセカンダリIndex内ある場合、
クラスタIndexを走査せず値を返却する
Adaptive Hash Index(AHI)(適応型ハッシュインデックス)
頻繁にアクセスされるインデックスのページに応じて
メモリ内に構築されるハッシュインデックス
キー値に対する値を取得する際に使用される。
(= または <=> 演算子を使用する等価比較にのみ使用される)
Indexの走査を行わないため高速にアクセスできるが、
範囲検索などの場合には使用されない。
__○__
/ \
○ ○
/\ / \
○ ○ ○ ○
↑ ↑ ↑ ↑
□□□□□□□□□□□□□□□□□ <- adaptive hash index
適応型ハッシュインデックス
B ツリーインデックスとハッシュインデックスの比較
Change Buffer(変更バッファ)
buffer pool上に変更対象のセカンダリインデックスのページが存在しない場合、
変更は変更バッファーという特別な構造のみ記録される。
変更バッファーは定期的にマージされる
圧縮テーブル
page単位で圧縮でき、データ、インデックス両方に適用される。
innodb_file_per_tableが有効
innodb_file_formatがBarracuda
の状態で、
ROW_FORMAT=COMPRESSEDを指定しテーブル作成。デフォルトで8KBに圧縮される。
KEY_BLOCK_SIZEでサイズ調整も可能。
zlibライブラリにより圧縮されているとのこと。
CREATE TABLE `test` (
id int ,
name varchar(128),
PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8
InnoDBの制限
InnoDBの最大Index長、数などの制限。
公式へのリンクだけ。
InnoDB テーブル上の制限