好奇心の赴くままに RSSフィード Twitter

2009-01-30

DBの構築について

更新系クエリと読み出し系クエリのユーザを分ける

複数台構成のサーバアクセスするときは更新系クエリはマスターに発行して、

読み出し系クエリはスレーブに発行するので別々のコネクションを使います。

この時にマスターに接続するユーザとスレーブに繋げるユーザを別にして、

マスターへのユーザは更新権限があって、スレーブへのユーザは更新権限がないようにしましょう。


クエリキャッシュ

ここでいうクエリキャッシュDBレベルではなくアプリケーションレベルでのキャッシュです。

DBクエリキャッシュはテーブルが更新されるとキャッシュがクリアされてしまい、

頻繁に更新されるテーブルに対しては有効に機能しません。

世の中のデータには即時性の必要ないデータがいっぱいあって、

即時性の必要ない遅延が許されるデータに対しては、

DBからクエリした結果をそのままキャッシュします。

次回以降はDBに直接アクセスせずにキャッシュしてデータを使用します。


PHPで書かれたwebサービスを高速化する2

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 − インデックスを使用してレコードを選択

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_%';


MySQL のクエリ最適化における、もうひとつの検証方法