DBのチューニング
メモリー(キャッシュ)とハードディスクの速度差を意識し、
メモリーの中で処理が出来なくなって、ディスクにデータを読みに行ったら負け
Ⅰ,explainを使って、DBに適切なindexをはる。
http://d.hatena.ne.jp/Dogison/20090130/p1
Ⅱ,DBのクエリーの見直し
どのクエリーで時間がかかっているかを見直す
・量(同じクエリーを何回も呼んで時間がかかっている)、
・質(一つのクエリーが重たくて時間がかかっているのか)
Ⅲ,アプリケーションを見直す
Ⅳ,mysqlのパラメータを設定し直す
show variables like 'sync%'; パラメータの確認
変更は、
1,my.cnfファイルにパラメータを書くか
2,SQL文で動的にセットするか(DBをrestartすると元に戻る)
変更するパラメータ
・グローバルバッファ(mysql全体で一つだけ確保されるもの)
出来るだけ割り当てるべき
・スレッドバッファ(コネクションごとに確保されるもの)
コネクションが増大すると、メモリー不足になるため、
あまりメモリーを割り当てるべきでない
http://dsas.blog.klab.org/archives/50860867.html
http://logic.stepserver.jp/memo.cgi/archive/638/
Ⅴ,メモリーを増設する
メモリーの使用量の確認はsar -rコマンドで確認
iowaitが20%だとCPUにすると4倍なので、l/o負担は100%
Ⅴ,メモリーを増設できないとき
(これ以上増設できないとき)
キャッシュできない部分を別々のサーバに分ける。
・通常のリクエスト → 人気エントリー
・bot → 古いデータまでリクエストされるが、
応答速度は速くなくていい
・user名など → 決まった数だけ返すレコード
Ⅵ,マスター/スレーブ構成に設定する(MySQL)
参照系はスレーブ、
更新系はマスターにアクセスする。
※更新系で付加を分散する必要がある場合はDBを分割する
↓
運用が複雑になり、故障率も上がるため、出来るだけ避けるべき