MySQLでのクエリの最適化

今日はMySQLについて書こうと思います。
これはなんだかんだ興味深いトピックなので、
ネット上でもかなり情報を集めることが出来ます。
タイトルはクエリの最適化とか書いていますが、
全然専門的な知識はないのでそれなりに。


まず前提の話として、
適切なtable設計をするというのがあります。
正規化を行い、indexを貼る、と。
indexを貼りまくると重くなるので注意が必要ですが、
どのように検索するかをあらかじめ想定してindexを貼ります。
テーブル設計を変更する際は、
ALTER TABLEを上手に使いこなそう。
によればテーブルの中身を全部コピーしているらしく、
データが増えてからテーブル設計を変えるのはかなり大変です。


SQLを書いた後はEXPLAINを使って
クエリの分析をしましょう。
MySQL:インデックスまとめメモ
とか参照にしつつ、"Using filesort"とか出ないように。
クエリ一つ変えるだけで劇的に早くなることもあります。


あとは、slow_log_queryですかね。
データ量が増えたら何か重くなったとか、
そういうのを確認するのに便利。
MySQL 5.1のスロークエリログ
参照。このサイトにも書かれてますが、
5.1からオプション名が変更されています。
この前新しくMySQLをインストールしようとしたとき
少しびっくりしました。


memcachedとかキャッシュする仕組みを使って
MySQLにクエリを発行する回数自体を出来るだけ少なくするというのも有効。
その場合はざっくりデータを持ってくるようにすると無駄が少ないです。
その辺の設計については
memcached活用は、格納オブジェクトの”粒度”がキモ
など参照してください。


データベースはボトルネックになりやすいので、
気をつけないといけないことが色々ありますね……