MySQL5.7以降では実行中のクエリのEXPLAINが取れる
誰かさん(人じゃないかもしれないけど)が非常に重いクエリを流してたとする。
しかもそれは処理が終わってないとスロークエリに出ないので、EXPLAINで実行計画確認したくても5.6まではできなかった。
(PROCESSLISTのInfoはクエリの全体は見えないことが多いから)
でも、5.7からは取れるんです。
取り方
SHOW PROCESSLIST;
で実行中のクエリのIDを取得しましょう。
(※社内DBの情報部分についてはぼかして表示しています)
上の例だと 1670163 ですね。
EXPLAIN for connection <ID>
で今実行中のクエリのEXPLAINが取れるんです。
EXPLAIN for connection 1670163
と入れて実行すると以下のように実行計画が確認できます。
上の例だとインデックスは利いてるんだけど一行目にあるテーブルが刈り込まれてないんだなー、ということが分かります。
ちなみに
ここで少し残念なのは Visual EXPLAINで表示できない ことですかね。
とはいえ、
もし、実行中のクエリがshow processlistで見つかって、そのMySQLのバージョンがMySQL5.7以上ならぜひ使ってみてください。
参照
https://dev.mysql.com/doc/refman/5.7/en/explain-for-connection.html
https://dev.mysql.com/doc/refman/8.0/en/explain-for-connection.html