エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【SQL】インデックスあるのにクエリが遅いと言われて調査してみた話【742日目】

調査依頼が来ました

『この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も活用され、超スピードに。

意外とちょっとした工夫でクエリは早くなるし、遅くもなるんですねφ(・