indexの設計
from index
基本的な方針
record数が1万以上の大規模なtableに対して作る
小さいtableの場合、インデックスるを使うよりもフルスキャンした方が高速
cardinalityが高く、選択率が低いcolumnに対してIndexを作る
選択率が5~10%前後のcolumnに対して作る
ただし、常にこれだけやっていれば有効というわけでもないので注意mrsekut.icon
参考
/mrsekut-book-4774173010/319 (10.2 インデックスを有効活用するには)
細かいユースケースがいくつ書かれているので何度でも読むと良さそう
/mrsekut-book-4798124702/302 (6-3 B-treeインデックスの設計方針)
細かいユースケースがいくつ書かれているので何度でも読むと良さそう
#WIP
そのtableのユースケースにも依存する
そのSQLに代入される値の種類にも依る
SQLの書き方にも依る
e.g. where句の選択条件、または結合条件に使用されているcolumnに作成する
使えない条件もたくさんある
/mrsekut-book-4774173010/325
中間一致や後方一致は無理
colにindexを作ったとき、where col*1.1 > 100ではIndexを有効活用できない
where col > 100/1.1とすればindexを活用できる
ORは使えない
代わりにINを使う
否定形(<>, NOT INなど)には使えない
など
どのタイミングで設計・作成すべきか
あまり明文化されていないので推測mrsekut.icon
「full scanよりもIndexを作った方が高速になる条件」を見つけたらやる
日々データが溜まっていく系のサービスなら、データが増えていき条件を満たした段階でやる
その時の、tableの使われ方や、SQLの書かれ方に合わせて作っていく
だからたぶん、tableの設計時や、プロジェクトの初期段階には作らないはず
#??
途中で変更するコストはあるのか
例えば、再起動が必要、とか
/mrsekut-book-4774173010/327 (10.4 インデックスが使用できない場合どう対処するか)
アプリケーションのUIを工夫する
Data Mart、サマリテーブルを使う
index only scanを使う
covering index
定期的なメンテを行うべき
/mrsekut-book-4798124702/311
クラスタリングファクタ
クラスタ化係数
storage上で同じ値がどの程度物理的に固まっているかを表す指標
低いほど固まっているため、アクセスするデータ量が小さくなって良い
/mrsekut-book-4774173010/320
物理的配置に依存するのであまり参考にされない(?)