1. ストレージエンジン
ストレージエンジンと、永続性、ロック機構、トランザクション処理の振る舞いや分離レベルといったストレージエンジンの基礎となる動きについての理解なしに、MySQL自体やモデルデータのコードをいじるべきでない。それに加えて、InnoDBのクラスタ化されたプライマリキーや、MyISAMの全文検索インデックスのようなコア要素も、極めて重要な情報だ。
2. インデックスのコンセプト
特に以下のような点について。
- カバリングインデックス
- 連結インデックス
- インデックスを使ったソートの最適化
- varchar型やレンジの広いスキャン(日付型やint型)に対するインデックスのパフォーマンス影響
- カーディナリティの仕組みと、なぜそれが重要なのか
- クエリヒントがなぜ必要なのかと、それがどのように徐々に問題になってくるのか
- ワイルドカードとフルテキスト
3. データタイプ
- 正しくintegerのタイプを選ぶことの効率性、signedとunsignedの違い
- varcharより固定長charを使った方が適している場合
- int型、varchar型、enum型、char型それぞれに対するパフォーマンスの影響
- textとblob型のパフォーマンスとストレージの特徴
- varchar(255)が単なる無精であること
- intの定義、表示と保存のどちらを取るか
4. 巨大あるいは同時アクセスの多いテーブルのパーティショニング
プルーニングの動き。パーティションのタイプといつどれが適切なのか。たくさんのパーティションがあるテーブルのパフォーマンス影響。
5. トランザクション
長時間続けてはならない。同時アクセスの多いアプリケーションにおいて、更新に対する参照がどのようにロックを引き起こすのか。
6. コネクションプーリングとコネクション管理
7. クエリの動作
explainを使うこと。pt-query-digestのようなツールを組み合わせて、クエリの動作を知るためにプロファイルやクエリのログを取る。それらのクエリが同時アクセスが多かったり巨大なデータセットの場合どのように動くかを知る。
8. ビューとトリガのパフォーマンス影響
9. MySQLの権限とその付与(grant)
10. リレーショナルデータベースに向いている処理・向いていない処理の理解
キャッシュ機構によるレバレッジ、キューイング処理、外部検索、ログの保存先としての使用などなど…(MySQLだけの話ではない!)
11. 機能的なパーティショニング、シャーディング、単一インスタンスの使い分け
12. アーカイブやパージのためのデータ管理戦略
13. プライマリキー、ユニークキーなどの制約
何がよいプライマリキーで何がよくないのか。ユニークキーなどの制約の運用上、パフォーマンス上の影響。
14. 環境への変更の仕組み
オンラインスキーマ変更、レプリケーションに対する影響など。
15. レプリケーションのコンセプト
シリアルで非同期であり、レイテンシがどのように発生するのか、クエリにどのように影響するのかなど。