2009-01-30
DBの構築について
複数台構成のサーバにアクセスするときは更新系クエリはマスターに発行して、
読み出し系クエリはスレーブに発行するので別々のコネクションを使います。
この時にマスターに接続するユーザとスレーブに繋げるユーザを別にして、
マスターへのユーザは更新権限があって、スレーブへのユーザは更新権限がないようにしましょう。
ここでいうクエリキャッシュはDBレベルではなくアプリケーションレベルでのキャッシュです。
DBのクエリキャッシュはテーブルが更新されるとキャッシュがクリアされてしまい、
頻繁に更新されるテーブルに対しては有効に機能しません。
世の中のデータには即時性の必要ないデータがいっぱいあって、
即時性の必要ない遅延が許されるデータに対しては、
次回以降はDBに直接アクセスせずにキャッシュしてデータを使用します。
explainの使い方
mysql>explain select a, b, c from table_A where a = 1 or b = 3;
悪い結果
using filesort(余分なソート)
using temporary(一時ファイルの作成)
これは、テンポラリーのバッファが利用されるので、
ORDER BY があったり、count(*) 検索していたりすると、
頻発する気がする。
いい結果
using index(DB本体を読む必要なし)、
Where used(type:ALLとの組み合わせだとindex作成推奨)"
優先順位は以下の順番で、cont とか、eq_ref 出るとベスト♪
cont − 1つのレコードを選択。テーブルに1レコードしか存在しない
eq_ref − 1つのレコードを選択。(プライマリキー、ユニークキーを使用)
ref_or_null − ref と同じ状態だが、レコードにNULLが含まれる
range − インデックスを使用してある範囲のレコードを選択
index − インデックスを全件頭からなめることになる
ALL − テーブル内のすべてのレコードを検索対象とする(インデックスを使わない。データを全件頭からなめることになる)
http://blog.goo.ne.jp/ketoyada/e/bbf6510489807af64b52a0f499abeb68
EXPLAINで判断できない場合は
show statusを使う
mysql> show status like 'handler_read_%';

