MySQLメモ
参考にした本
- 実践ハイパフォーマンスMySQL
サーバーアーキテクチャ
最適化と実行
並行性の制御
- サーバレベルとストレージエンジンレベルの2つのレベルで行う必要あり
Read/Write Lock
- Read Lock: 共有ロックで相互にノンブロッキング
- Write Lock: 排他ロックで、Read Lockと他のWrite Lockをブロック
トランザクション
分離レベル(ACIDのI)
- SQL規格では4つの分離レベルを定義
- 分離レベルが低いほど並行性が高くなり、オーバヘッドが低くなる
- 4つの分離レベルまとめ
分離レベル | Dirty Read | Non-Repeatable Read | Phantom Read | Read Lock |
READ UNCOMMITED | ◯ | ◯ | ◯ | × |
READ COMMITED | × | ◯ | ◯ | × |
REPEATABLE READ | × | × | ◯ | × |
SERIALIZABLE | × | × | × | ◯ |
- READ UNCOMMITED
- READ COMMITED
- REPEATABLE READ
- SERIALIZABLE
- 競合しないようトランザクションを強制的に順序付けする
- 読み取る全ての行にロックを設定
トランザクションログ
マルチバージョンの並行性制御(MVCC)
- InnoDB,Falcon,PBXT
- ×:単純な行ロックメカニズム
- ◯:行レベルロック+MVCC
- MVCC
- MVCCのメリット
- 多くの場合でロックの必要性を完全排除し、オーバヘッドの多くを解消
- ロックを使用しない読み取りを許可し、かつ書き込み操作では必要なレコードのみをロックすることができる
- MVCCの実装
- ストレージエンジンごとに違う
- Optimistic/Pessimisticな実装がある
InnoDBのMVCC
- 行ごとに2つの隠れた値を格納
- 行が作成されたタイミング
- 行が期限切れ(削除)されたタイミング
- イベントが発生した実時間ではなく、システムバージョン番号を記録
- 新しいトランザクションの開始ごとにインクリメントされる番号
- 各トランザクションは開始時点でのシステムバージョン番号を記録
- クエリは、それぞれ、各行のバージョン番号とトランザクションのバージョンとを照合しなければならない。
- 照合条件は分離レベルで異なる
- MVCCはREPEATABLE READ/READ COMMITEDのみ対応
- 本にはREPEATABLE READの時のCRUDクエリそれぞれにおいて条件が書かれている
ロック方式 | 並行性 | オーバーヘッド | エンジン |
テーブルレベル | 最低 | 最低 | MyISAM,Merge,Memory |
行レベル | 高 | 高 | NDB Cluster |
MVCCを備えた行レベル | 最高 | 最高 | InnoDB,Falcon,PBXT,solidDB |
ストレージエンジン
- MySQL6.xの時点で13種類ある
Engine | MySQL Version | Transaction | Lock粒度 | usage | 使用すべきでない状況 |
MyISAM | ALL | × | 同時挿入可能なテーブル | SELECT,INSERT,一括READ | Read/Writeの混在 |
Memory | ALL | × | テーブル | 中間計算、静的lookup | 大きなデータセット、永続化 |
InnoDB | ALL | ◯ | MVCC+行レベル | Transaction | なし |
Falcon | 6.0 | ◯ | MVCC+行レベル | Transaction | なし |
Archive | 4.1 | ◯ | MVCC+行レベル | Log,集計 | ランダムアクセス,更新,削除 |
NDB Cluster | 5.0 | ◯ | 行レベル | 高可用性 | 典型的な用途 |
PBXT | 5.0 | ◯ | MVCC+行レベル | Transaction,Log | クラスタ化インデックスの必要性 |
solidDB | 5.0 | ◯ | MVCC+行レベル | Transaction | なし |