29. ●
相関サブクエリー使ってる
● サブクエリーの内側の WHERE 句で外側クエリーのテーブルのカ
ラム参照してるやつ。
– SELECT .., (SELECT .. FROM t2 WHERE t1.xx> t2.yy)
FROM t1 .. WHERE .. みたいな。
●
相関サブクエリーは外側クエリーからフェッチした行数だけサブク
エリーを実行するので、外側クエリーのテーブルが大きくなれば
なるほど一気に重くなる。
● CPU 使用率を跳ね上げることが多い。というか CPU 使用率が跳
ね上がったら大量アクセスかこれを疑う。
● パズルだと思って JOIN に書き換えるか、中間テーブルやアプリ
側に一度値を保持させてクエリーを分割する。
● EXPLAIN すら返ってこなくなるパターンはほぼこれ。
● PostgreSQL はこのへんもそつなくこなすイメージ。
30. ●
インデックスが足りない
● MyISAM はテーブルスキャンでも割と速いけれど、そのノリで
InnoDB に向かうと地獄が見える。
● MySQL が 1 つのリレーションで使えるインデックスは基本的に 1
つだけなので、重いクエリーには複合インデックスを作る。
– 基本その 1 、 WHERE 句の AND 条件でつながれているもの
を順番に並べる。
– 基本その 2 、それに ORDER BY で使われているカラムを足
す。
– SELECT .. FROM .. WHERE c4= xx AND c2= yy ORDER
BY c3 なら、 (c4, c2, c3)
– 不等号とか OR 演算子使ったりすると ORDER BY まで波及し
ないとか、 LIMIT 使ってるなら WHERE よりも ORDER BY を
狙ってインデックス作ると速いとかこれ以外にもコツはある。
● 特に COUNT は全てインデックスで解決できないと非常に重い。
32. 831 さん、お便りありがとうございます。
MySQL はアホの子なので、難しいクエリーを投げ
るとなかなか返してくれません。 MySQL でも判るよう
な簡単なクエリーに書き換えたり、インデックスでヒント
をあげて下さい。
大事なことなのでもう一度言います。 MySQL はア
ホの子です。ナントカとハサミは使いようだと思って頑
張ってください。