DBIx::QueryLog でクエリの実行計画も丸見えにする!
2011-12-20
好きって言葉は最高さーー!!!!kamipoです!!今日はAKB48の紅白対抗歌合戦があるので急いでいきたいと思います!!
DBIx::QueryLog で EXPLAIN の結果もロギングしたい
xaicron さんの9日目のエントリ、[/articles/advent-calendar/2011/dbix/9:title=DBIx::QueryLog で DBI で実行された SQL を丸見えにする!]でおなじみの神モジュール DBIx::QueryLog 便利ですよね!?
でもEXPLAINの結果もロギングできたらもっと便利だと思いませんか?僕は思いました!!
そこで、EXPLAIN の結果もロギングできるパッチを取り込んでもらったので、新しいのが出たら使えるようになると思います!(いまはまだMySQLだけですが…)
つかいかた
とくにクエリに意味はないですが、こういうクエリを投げると
use strict; use warnings; use DBI; use DBIx::QueryLog; my $dbh = DBI->connect( "DBI:mysql:dbname=test;host=localhost", { AutoCommit => 1, RaiseError => 1, }, ) or die $DBI::errstr; DBIx::QueryLog->explain(1); my $rows = $dbh->selectall_arrayref( 'SELECT * FROM akb48 a, akb48 k, akb48 b WHERE a.id = k.id AND k.id = b.id AND a.id = ?', +{ Slice => +{} }, 48, );
[2011-12-20T17:01:10] [main] [0.000581] SELECT * FROM akb48 a, akb48 k, akb48 b WHERE a.id = k.id AND k.id = b.id AND a.id = '48' at akb48.pl line 18 .---------------------------------------------------------------------------------------------. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | a | const | PRIMARY | PRIMARY | 4 | const | 1 | | | 1 | SIMPLE | k | const | PRIMARY | PRIMARY | 4 | const | 1 | | | 1 | SIMPLE | b | const | PRIMARY | PRIMARY | 4 | const | 1 | | '----+-------------+-------+-------+---------------+---------+---------+-------+------+-------'
EXPLAIN がログに出ました!これで INDEX が効いてないクエリもすぐ見つけられて捗りますね!!
これだけだとあれなので、僕が EXPLAIN でどこを見てよくないクエリを判断してるのかというと、まずは rows を見ればいいです。rows が十分に小さいクエリは大丈夫です。rows が大きいと重いクエリになりうるのでそういうときに possible_keys や key を見て自分が想定してる実行計画か、もっとよい実行計画にできるかを考えるのがよいと思います。
それではそろそろ時間なのでこれにて。
あ~〜!よっしゃいくぞーー!!!!