前回に引き続き、大規模サービスを運用するときに必要になるMySQLの知識についてのまとめ
テーブル・SQL設計
- 大前提としてすべてのデータをいかにメモリ上にのせられるかが大事
- カラム定義の際、データサイズをなるべく小さくするようにする
- インデックスを適切にはる→特にid系のデータ(whereやjoinで使用されるもの)
- ただしインデックスはある程度のデータ量出ないとスピードが出ない(千件程度なら問題ない)&更新時には遅くなる
- あるテーブルに二つのカラムがあり、独立してインデックスが張られていた場合、2つのカラムで検索しても片方だけしか使われない。この場合、組み合わせたキーで検索をかけた場合のパフォーマンスを上げたい場合、組み合わせたカラムに対してインデックスを張る必要がある
- 具体的なパフォーマンスを知りたい場合、EXPLAIN句のROWの部分を少なくするようにする
http://skill-up-engineering.com/?p=1288
レプリケーション機能
- データベースをマスターとスレーブに分ける。スレーブは常にマスタのコピーという状態にする
- スレーブは主に参照系の処理の対応。更新系の処理は基本的にマスタで一括対応。(複数にわけると整合性をとるのが難しいため)
- 上記のような用途から必然的にマスタのスケールはあまりしない。
- ダウン時のリカバリがとても大変。
パーティショニング
- データがメモリ上に乗らない場合につかう最終手段
- テーブルを別々のサーバーにわけること
- 別々のサーバーに分けるとJOINができないため、JOINをするような要素のものはパーティショニングさせない。
- メモリ増設で対応できるならそちらで対応したほうがコスパ的にはいい