調査依頼が来ました
『このSQL、table_nameにindexもwhereも用意してるのに遅いからチェックしてー』って言われて、調査をしてみようと思いました。
select data.* from (select * from table_name left join ~~~~) as data where table_name.date ~~
あ、これは遅いですね(´・ω・`)
何が遅い?
EXPLAIN select data.* from (select * from table_name left join ~~~~) as data where table_name.date ~~
のように、EXPLAINを頭に付けてみると、実行どんなふうにするかデータが見れます。
すると、インデックスかけてたつもりのテーブルが、TYPE ALLで取得されているのがわかりました。
取得レコード数も数十万行。
あれー?whereかけたのにー?って思ったときに注目したのがここ。
全取得してからwhere?
from (select * from table_name left join ~~~~)
ああ、一回全取得してから、その後にwhereかけてるんだ。
全取得してるから重いし、indexとかそれ以前の話ですね。
先に絞り込んでみた
一旦要件的には変わらなさそうなので
select data.* from (select * from table_name left join ~~~~ where table_name.date ~~) as data
whereを移しました。
この直し方の何点は、orWhereとかがas dataの後に書かれたら困るとか、いろいろ。
でも、from内で絞り込まれたおかげで、5000件の中からの探査に探査に変わりました。
加えて、その絞り込み時点でindexも活用され、超スピードに。
意外とちょっとした工夫でクエリは早くなるし、遅くもなるんですねφ(・・