MySQLチューニング

今週はちめちめとDBのチューニングしております。

実際のサイトの速度はこんな感じ
http://moeten.info/maidcafe/i/
せっかくなのでMySQLを早くしたいときに気を付けるポイントです。

  • インデックスを作成する

プライマリーキーやインデックスはとりあえず貼っておく。AUTO_INCREMENTも便利なので設定しておく。

  • WHERE句でよく使われるカラムに複数インデックスを作成する

複合インデックスは知っておいて損はなし。インデックスを貼る順番にも気を付ける。けっこうキリがない。

  • DELETEは遅いので使わない。

なるべくUPDATE hoge SET print = 0 などを使用する。

  • EXPLAINでSQL文がどのように探索されているか解析する。

keyが使われていることとrowsの合計件数が少なくなるようにする。rowsはおそらく掛け算で合計行数。

  • テーブル結合時にSTRAIGH_JOINを使用してテーブルの結合順を指定する

EXPLAINによって表示されるrowsの件数が変わる。なるべくrowsの件数が少なくなるようにテーブルを結合させる。

  • LEFT JOINを検討する。

LEFT JOIN を使用すると普通にテーブルを結合するよりも早い場合がある。

  • LEFT JOINをする際 STRAIGH_JOIN をつけた方が早い場合がある。つけないほうが早い場合もある。

こちらでテーブルの並びを指定するよりMySQLのほうが賢い場合がある。

  • SQL_CALC_FOUND_ROWSは便利だけど処理が遅くなる場合がある

その場合は件数取得用SQL別に書く。そしてPHPmysql_num_rowsで件数を取得する。

  • LEFT JOINする際 SQL_CALC_FOUND_ROWS が無視される場合があるのでなるべく一緒に使用しない。

バージョンによるバグ?
SQLにかかる時間が0.2秒くらいだと静的ページにアクセスしている感じ。
0.1秒以上かかるSQLはメールで送ったりすると便利かも?

あ、自分はデーターベース屋さんじゃないので、なにかいいポイントがあったら教えて欲しいです。
MySQLは日付の足し算とかできるので面白いですよー
チューニングで参考になる本。Amebaの中の人の本。

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

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