MySQL EXPLAIN入門を受けてみた | モンスター・ラボTech/Designブログ

モンスター・ラボTech/Designブログ

株式会社モンスター・ラボのテクノロジスト、デザイナーによる持ち回りブログです。

はじめまして、「目が根っこ」じゃなくて「メガネっ子」ことさやっぺです。
モンスター・ラボ持ち回りブログ第一弾!ということでものすごーく緊張しております…!

私はモンスター・ラボのテクノロジストとして、普段はWebサービスの開発に携わっています。
が、社会人2年目ということでまだまだ勉強することがいっぱいな毎日ですヽ(;´Д`)ノ

そんな私が今回書く内容は「EXPLAIN (MySQL)」。
そもそもEXPLAINとはなんぞやという話ですが…
EXPLAIN => SELECT 文でのクエリの実行計画を教えてくれるもの
だそうで、MySQLの場合は、
「EXPLAIN SELECT ~」という様に、SELECT文の頭にEXPLAINを付ければOKだそうです。

じゃあそれを使ったら何がわかるんだろう…
色々調べていたところ、下記のサイトを見つけました。

■ ソーシャルゲーム開発者なら知っておきたい MySQL INDEX + EXPLAIN入門
http://www.infiniteloop.co.jp/blog/2011/03/mysql-index-explain/

どうやら、EXPLAINを使うと、

* 検索対象テーブルの中で、実際にクエリで使われたINDEXが分かる
* INDEXに対するデータの検索範囲が分かる
* クエリを解決するためにMySQLが何をしなければいけないかが分かる

といったような事が分かるらしいです。
ということで、上記のサイトとにらめっこしながら、レッツトライ!
どんな感じかなぁ…と見ていったところ、ありました。怪しそうなところ!(*゚Д゚)
Extraという項目で、
「Using where; Using temporary; Using filesort」
と出ていました。

そこでまた上記のサイトを確認していくと、
Using temporary; Using filesort が出ると要注意!」とあるではないですか!
何かというと、
Using temporary :  ORDER BY句にINDEXを使用できない
Using filesort :  クエリの解決にテンポラリテーブルの作成が必要 ORDER BY にINDEXが使用できない場合、ORDER BY とGROUP BY式が異なるときなど

と記載されています。
これらを総称して解釈すると、

検索早くするためにINDEXを使っているのに、それが使用できない状態ため、
MySQLの処理上時間がかかる(無駄な作業を行なっている)方法を取ってしまってる、

感じになるんでしょうか…
無駄なことさせちゃってるんですね。これはマズイ(;´Д`)

これを修正しなければならないんですが、
同じアプリで別の改修作業もあるので、それと同時に対応をするように進めています。
ちなみに、どうやって修正しなきゃいけないのか、などはまだまだ勉強中です…(´・ω・`)
機会があったら書きたいと思いますが、もしかしたら別の方がネタにしてくれるかも…!?

ということで、今回はこの辺でヾ(゚ω゚)ノ゛

*余談*
ちなみになんでその話題かといいますと、SQLのチューニングをせねばという話がでてきたからなんです。
しかしSQLチューニング、「何すればいいんだろう…?」という状態だったので、
とりあえずプロジェクトのマネージャー(11月18日に登場します♪)に訪ねたところ、
「EXPLAINっていうので、どういう状態かチェックできるからそれ見てみたらいいと思う」
というアドバイスをもらったので、調べたり試してみた、という感じです。