EXPLAINとは
クエリを実行する際、ボトルネックとなっているポイントがどこにあるかを確認するために使用されます。
出力される項目を理解することで高速なクエリを作ることができます。
実行方法
確認したいクエリの前にEXPLAIN
を付けるだけ
このtypeが出ていたら見直し!
ALL
見直し推奨!
フルテーブルスキャンが行われている。とても遅い。
index
ALLよりは早いがフルインデックススキャンされている。
数行だけだったら問題ないが、クエリが返す行数が多い場合、パフォーマンスが悪い。
Extraを見る!
Using filesort
結果をソートするために一時テーブルでのファイルソートが発生している。
クエリのORDER BY
でインデックス使われてない可能性があるのでパフォーマンスが悪い。
ORDER BY
でインデックスを使用する。
Using temporary
クエリの実行中に一時テーブルが作成されていることを示している。
JOIN
、ORDER BY
、GROUP BY
、DISTINCT
などを使用すると発生することがあり、
一時テーブルの作成することでパフォーマンスのボトルネックになる可能性がある。
tmp_table_size
やmax_heap_table_size
などの設定を調整することで解決する。
また、ORDER BY
、GROUP BY
を使用している場合は、インデックスを使うようにする。
クエリを早くするには…?
-
否定を使わない
<>
、!=
、NOT 〇〇
を使うとインデックスが使用されず、フルテーブルスキャンが行われてしまう。 -
SELECTの
*
は使わない
必要なカラムのみ指定したほうが早い -
DISTINCTやUNIONなどの重複排除は使わない.
重複排除を行う際、一時テーブルが作成されるので避ける。 -
適切なインデックスを使用する
どのインデックスが使用されているか確認するにはEXPLAIN
のpossible_keys(使われるインデックス候補)
およびkey(使われたインデックス)
を見る。
参考記事
-
MySQLのEXPLAINを徹底解説!!
https://nippondanji.blogspot.com/2009/03/mysqlexplain.html -
EXPLAINのExtraの項目ちゃんと理解している..?
https://zenn.dev/miya_tech/articles/c1b9ca01e90a7b -
MySQL SlowQueryの対処法
https://qiita.com/nikadon/items/2f66b447ed6d3b26d78e -
クエリチューニングによる速度改善34項目
https://qiita.com/ichi_zamurai/items/fdbe3872a505c22ee431 -
SELECTをアスタリスクと列指定したときの速度差
https://kagamihoge.hatenablog.com/entry/20130913/1379071941