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を分割する

運用が複雑になり、故障率も上がるため、出来るだけ避けるべき

DBの構築について
mysqlでのqueryのチューニング


「実現したいことを計算機の問題に置き換えることが『技術力』」、伊藤CTOが“はてな流”大規模データ処理の極意を語る