新ストレージエンジン Falcon のアーキテクチャ詳細技術解説 - MySQLカンファレンス2007
Falconとは
InnoDBとの主な差異
ほかのストレージエンジンとの比較
図
Falconのアーキテクチャ概略
- 4つのメモリ領域に分けて開設 Record Cache, Page Cache, Log Cache, System Cache
- できるだけ多くのレコードをRecord Cacheに乗るようにしてある
- Record CacheはPage Cacheよりもオーバーヘッドが少ない
プロセス/スレッド
ファイルの読み書き
シリアルログファイル、データファイル
インデックス構成
インデックス値の圧縮
- 接尾辞の圧縮
- 数値型:末尾のゼロを圧縮
- 文字列型:末尾の空白を圧縮
- 接頭辞の圧縮
- 各ページの先頭のインデックス値は圧縮しない
- 2番目以降のインデックス値は、開始何倍とが先頭のインデックス値と一致するかを調べ、その分を圧縮する
- うまくいくと60%ぐらい圧縮できる
- 圧縮処理をするので当然CPUは使っちゃう。on/off切り替え可能にするか検討中
インデックスアクセラレータ
レコードの取得
- インデックスを検索し、レコード番号を取得
- レコード番号から実際のレコードを取得
- メインのレコードの取得はキャッシュから行われる
データ型と消費サイズ
FalconはTEXT/BLOB型を別メモリ領域に管理する
AUTO_INCREMENTの動作の違い
トランザクション、ロック、MVCC
ロストアップデートの自動検知
- ロストアップデートとは
- Falconの動作を、設定でInnoDBと同じにすることもできる(デフォルトで同一にする方向)
Next-Key Lockingとは (InnoDBのロック制御)
- InnoDBログファイルとバイナリログの不整合をっふせぐために必要な実装
- Insert INTO t1 .. SELECT .. FROM t2
- t2に対して共有ロックをかける
- UPDATE t1 SET xx WHERE non_index_column=x;
- フルテーブルスキャンになる。スキャンしたレコード全体に対して排他ロックをかける
- UPDATE t1 SET xx WHERE non_unique_index_column=x;
- 当該インデックスと、その前後に対して排他ロックをかける
- セッション1:INSERT INTO t1 SELECT * FROM t2
- セッション2:INSERT INTO t2 VALUES(...)
- セッション2がセッション1よりも前に終わったとする
- バイナリログの中身は、順番が逆転する
- Next-Key Lockingはこれを防ぐための実装
FalconではNext Key Lockingは発生しない
- 同時実効性の低下は5.1で回避される
参考資料
- マイコミジャーナル: Falcon徹底リサーチ
- MySQL Developer Zone: Falcon in depth ベータ版リリース後に公開
- MySQLオンラインマニュアルにて http://dev.mysql.com/doc/falcon/en/index.html
- MySQL Forge http://forge.mysql.com/wiki/Falcon