はじめまして、「目が根っこ」じゃなくて「メガネっ子」ことさやっぺです。
モンスター・ラボ持ち回りブログ第一弾!ということでものすごーく緊張しております…!私はモンスター・ラボのテクノロジストとして、普段は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っていうので、どういう状態かチェックできるからそれ見てみたらいいと思う」
というアドバイスをもらったので、調べたり試してみた、という感じです。