Maatkit というMySQL 用のユーティリティプログラムがあります。詳しくは インフラ系エンジニア勉強会 "hbstudy"でMaatKitについて発表してきました - marqs blog とか maatkitを一通り使ってみたメモ - ククラフト とかをどうぞ。
mk-query-profiler という、 SQL のプロファイリングをするやつを少し使ってみたのでメモ。そもそもプロファイリングって何よ?というと、たぶん 漢(オトコ)のコンピュータ道: プロファイリングで快適MySQLチューニング生活 みたいな話です。 SET profiling=1; が使える環境ならばそっちを使ったほうが良いのかも。
以下、実行例。諸事情により一部伏せてます。 -vv は verbose の意で、これつけないと I/O Operations と InnoDB Data Operations が表示されない。 slow.sql にはプロファイリングしたい SQL が書いてある。複数の SQL を空行をはさんで書いておくと全部実行してまとめてプロファイリングしてくれます。
今回対象にしてるクエリは、初回だけ猛烈に遅いことがあって二度目からはさくさく、 EXPLAIN してインデックスを調整してみたけど効果出ず、 iostat を眺めてるとクエリ発行のタイミングで I/O が跳ね上がる、という感じで、ほぼ I/O がボトルネックで間違いなさそうなんだけどもう少し裏付けが欲しかったのでプロファイリングしてみた、という経緯です。
[kyanny@xxxx ~]$ mk-query-profiler -D xxxx -u xxxx -vv slow.sql +----------------------------------------------------------+ | 1 (84.6154 sec) | +----------------------------------------------------------+ __ Overall stats _______________________ Value _____________ Total elapsed time 84.615 Questions 5594 COMMIT 0 DELETE 0 DELETE MULTI 0 INSERT 0 INSERT SELECT 0 REPLACE 0 REPLACE SELECT 0 SELECT 1 UPDATE 0 UPDATE MULTI 0 Data into server 208 Data out of server 39153 Optimizer cost 16890.209 __ Table and index accesses ____________ Value _____________ Table locks acquired 4836 Table scans 0 Join 0 Index range scans 1 Join without check 0 Join with check 0 Rows sorted 0 Range sorts 0 Merge passes 0 Table scans 0 Potential filesorts 0 __ Row operations ____________________ Handler ______ InnoDB Reads 87904 794908 Fixed pos (might be sort) 0 Next row (table scan) 0 Bookmark lookup 4 First in index (full scan?) 0 Next in index 0 Prev in index 87900 Writes Delete 0 0 Update 0 212 Insert 0 156 Commit 0 InnoDB row locks Number of locks waited for 0 Total ms spent acquiring locks 0 __ I/O Operations _____________________ Memory ________ Disk Key cache Key reads 0 0 Key writes 0 0 Temp tables 0 0 Temp files 0 InnoDB buffer pool Reads 888017 9044 Random read-aheads 132 Sequential read-aheads 10 Write requests 3843 121 Reads/creates blocked by flushes 0 InnoDB log operations Log writes 1756 72 Log writes blocked by flushes 0 __ InnoDB Data Operations ____ Pages _____ Ops _______ Bytes Reads 12868 11082 210829312 Writes 121 153 4717568 Doublewrites 121 8 Creates 22 Fsyncs 96 OS fsyncs 80 748544 [kyanny@xxxx ~]$ mk-query-profiler -D xxxx -u xxxx -vv slow.sql +----------------------------------------------------------+ | 1 (0.5920 sec) | +----------------------------------------------------------+ __ Overall stats _______________________ Value _____________ Total elapsed time 0.592 Questions 23 COMMIT 0 DELETE 0 DELETE MULTI 0 INSERT 0 INSERT SELECT 0 REPLACE 0 REPLACE SELECT 0 SELECT 1 UPDATE 0 UPDATE MULTI 0 Data into server 208 Data out of server 39153 Optimizer cost 16890.209 __ Table and index accesses ____________ Value _____________ Table locks acquired 18 Table scans 0 Join 0 Index range scans 1 Join without check 0 Join with check 0 Rows sorted 0 Range sorts 0 Merge passes 0 Table scans 0 Potential filesorts 0 __ Row operations ____________________ Handler ______ InnoDB Reads 87904 87922 Fixed pos (might be sort) 0 Next row (table scan) 0 Bookmark lookup 4 First in index (full scan?) 0 Next in index 0 Prev in index 87900 Writes Delete 0 0 Update 0 2 Insert 0 1 Commit 0 InnoDB row locks Number of locks waited for 0 Total ms spent acquiring locks 0 __ I/O Operations _____________________ Memory ________ Disk Key cache Key reads 0 0 Key writes 0 0 Temp tables 0 0 Temp files 0 InnoDB buffer pool Reads 296072 0 Random read-aheads 0 Sequential read-aheads 0 Write requests 33 0 Reads/creates blocked by flushes 0 InnoDB log operations Log writes 15 4294967294 Log writes blocked by flushes 0 __ InnoDB Data Operations ____ Pages _____ Ops _______ Bytes Reads 0 0 0 Writes 0 ######### 4294957055 Doublewrites 0 0 Creates 0 Fsyncs 1 OS fsyncs ######### 4294957055
いまいち読み方に自信がないけど、 I/O Operations -> InnoDB buffer pool -> Reads -> Disk の項が 0 じゃないのでディスクから読んでる -> 遅い、と言えそう (でも数字の単位がわからない) 二回目は Disk からの Reads は 0 なので全部メモリに載っててメモリから読んでるので速い。 InnoDB Data Operations -> Reads の Ops が何なのかもわからない。それ以外にも Overall stats -> Optimizer cost とかも見られる。
オプションもいろいろあって、まだほとんど試してない。 --external オプションがわからなくて、指定したファイルなり STDIN なりを一行ずつ読んでシェルのコマンドとして実行する、とか書いてあるんだけど、具体的にどういうコマンドをそのファイルに書いておいたらいいのかがわからない。誰か教えてください。
まだ mk-query-digest をはじめ他のツールはほとんど使ってないので、これからいろいろ試していきたい。また何か覚えたらブログにでも書きます。