MySQLチューニングメモ

サイトがらよくMySQLのSELECT分を使うので、PHPを使ってベンチマークを図っていたら結果が返ってくるまで1秒などかかっているものがあったので参考書を片手にチューニングをしてみました。
その際にいくつか便利なコマンドがあったので表にしてみました。

SQL_CALC_FOUND_ROWS LIMIT句を適応する前の合計値を算出できる。ただし、SQL分によっては遅くなるので、素直に別SQLでCOUNT句を使うほうがいい時もある。
ORDER BY RAND() 検索結果をランダムに並び変える。ORDER BY RAND() LIMIT 10 とするとランダム10件取得できる。
プライマリーキー指定 主キー。とりあえずは設定しないとMySQLの意味がない。
インデックス指定 よく検索に使われるカラムにインデックスを貼って置くと検索が速くなる。ALTER TABLE tablename ADD INDEX hoge (hoge_id)
複合インデックス指定 検索する複数のカラムにまとめて一つのインデックスを設定すると検索が速くなる。複合インデックスは貼る順番で速度が変わる。(hoge,moge) ≠ (mote,hoge)。ALTER TABLE tablename ADD INDEX hogemoge (hoge_id,moge_id)
Using index > Using WHERE > Using filesort > Using tempolary EXPLAIN句を付けてSELECT した際にUsing filesortやUsing tempolaryが表示されると構造や結合順を見直したほうがいい。
STRAIGHT_JOIN テーブルの結合順序を指定できる。なるべく行数を少なくして結合させるととりあえず検索が速くなる。
FORCE INDEX 強制的に使用するインデックスを指定できる。たまにMySQLはインデックスの面倒を見てくれなくなるので自分で指定する。
SELECT * SELECT 文でカラムを指定するときになるべく*を使用しない。カラムにバイナリ(BLOB)型があるとメモリを多く消費してしまう。カラムにblob型がある場合は、なるべくhoge_image(blob),hoge_image_isset(int)と複数カラムを作成しておく。(これ便利な方法がほかにもありそう)

まだまだチューニングが必要ですが、1秒かかっていたものが0.1秒以程度になりました(中には主キー検索なみに早くなったものも)。
これからは、なるべくUsing filesortが出ないようにこれからもチューニングしていく感じです。
こちらの本がかなりわかりやすくてためになります。

MySQLによるタフなサイトの作り方

MySQLによるタフなサイトの作り方