MySQLのクロスチェックもぼちぼち場数踏んできたのでIndexまわりのまとめ。

まず


・ストレージエンジンは必ず確認する。
 →indexの構成も変わるし、できればどっちでも試験したほうが○。
・InnoDBはプライマリキーの値がセカンダリに載ってる。
 →MyISAMでプライマリ含んだ複合とか張ってるところはInnoだと省略できる。
・InnoDBいいけどcountはMyISAMのほうが速い。
・テーブルのデータ件数を想定する。
 →多くなるとこはなるべくindex張りたい(テーブル分割も考慮せよ)。
・InnoDBだったら可能な限りプライマリキーを使う。
 →indexに実データが載ってる。
・張りまくってもメモリ食うし、index作るの時間かかるのでよくない。

EXPLAINで確認するとき


・typeにALLかrangeがきたら要チェック。
・ExtraにUsing filesort, Using temporaryがきたら要チェック。

index張るとき


・複合張るときはSQLに出てくるカラムの順番を合わせる。
・テーブル結合でORDER BYとか使うときWHEREとORDERは同じテーブルでやらせる。
・インデックスマージ使うとこもあるからindex作る順番も大事(同じテーブル内)。

~余談~JOINするか、アプリでアクションを分けるか


・一旦プライマリのみで取得→必要な項目をその中から取得
 →大量なデータ取ろうとしたときのOOMの発生を抑制しやすい○
 →MyISAMだとロックの軽減、I/O負荷の緩和が○
  →プライマリを含んだ複合セカンダリが発生しやすい×
 →SQLの発行回数が多くなるからCPUに負荷×
・JOINして一回で取得
 →SQLの発行回数が減ってCPUに優しめ○
 →データが多すぎたらOOMになるかも×

⇒JOINするかしないかは使うストレージエンジンとデータ件数と負荷試験のバランスを見ながら
決めたほうがいいんじゃないかと思ってる。結局。

お世話になったWeb


MySQLパフォーマンスチューニングのためのインデックスの基礎知識
ソーシャルゲーム開発者なら知っておきたい MySQL INDEX + EXPLAIN入門

お世話になった書籍


MySQLによるタフなサイトの作り方/佐藤 真人

¥3,360
Amazon.co.jp

最後に


↑の書籍はマジでオススメ。これをマスターしたら次は日本男児さんの本がいいらしい。
残念だがまだまだこの書籍でいける!

indexチューニングは大事だけど、結局小手先の技術になっちゃうからテーブル構成や
アプリの動きにまで気を配れるようにしなくちゃならん。