Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Maatkit  で  MySQL  チューニング YAPC::Asia Tokyo 2010  前夜祭
自己紹介 <ul><ul><li>金子 健介  (Kensuke Kaneko) </li></ul></ul><ul><ul><li>プログラマ @ ペパボ </li></ul></ul><ul><ul><li>刺身☆ブーメラン </li><...
 
Maatkit  とは <ul><ul><li>MySQL  用のユーティリティ集 </li></ul></ul><ul><ul><li>作者は実践ハイパフォーマンス MySQL の著者 </li></ul></ul><ul><ul><li>な...
MySQL  チューニングのいろは <ul><ul><li>EXPLAIN </li></ul></ul><ul><ul><li>SHOW INDEXES </li></ul></ul><ul><ul><li>スロークエリログ </li></u...
mk-query-digest <ul><ul><li>スロークエリログの統計データを表示 </li></ul></ul><ul><ul><ul><li>tcpdump  の結果なども読めるらしい </li></ul></ul></ul><ul...
使い方 <ul><li>$ mk-query-digest --fingerprints slow.log </li></ul><ul><li># Files: slow.log </li></ul><ul><li># Overall: 115...
結果の見方 <ul><li># Query 1: 0.00 QPS, 0.04x concurrency, ID 0x5C552C534D2A3440 at byte 3907 </li></ul><ul><li>#              ...
mk-query-profiler <ul><ul><li>もう少し詳しい情報を知りたい </li></ul></ul><ul><ul><ul><li>例 :  ディスク  I/O  がどれくらい発生しているか? </li></ul></ul>...
使い方 <ul><li>$ mk-query-profiler -u user -D database -vv sql.txt </li></ul><ul><li>+---------------------------------------...
結果の見方  (1) <ul><ul><li>今回は  I/O  に関係しそうな部分を重点的にみた </li></ul></ul><ul><li>+------------------------------------------------...
結果の見方  (2) <ul><ul><li>同じクエリのプロファイル結果(連続して実行) </li></ul></ul><ul><li>+----------------------------------------------------...
mk-query-profiler  は何をしているか <ul><ul><li>大半はオプションのパースと出力のフォーマット </li></ul></ul><ul><ul><li>実際に仕事をしてるのは  get_status_info() <...
プロファイル結果をふまえて <ul><ul><li>ディスクからのランダムリードが発生して遅くなっていた </li></ul></ul><ul><ul><li>Convering Index  を使えるようにインデックスを追加した </li><...
チューニング後  (1) <ul><li># Files: slow.log </li></ul><ul><li># Overall: 68 total, 8 unique, 0.00 QPS, 0.02x concurrency ______...
チューニング後  (2) <ul><li># Query 3: 0.01 QPS, 0.10x concurrency, ID 0xE4D15EB8FF64B268 at byte 6136 </li></ul><ul><li>#       ...
考察 <ul><ul><li>mk-query-digest  について </li></ul></ul><ul><ul><ul><li>統計情報をすばやく把握 </li></ul></ul></ul><ul><ul><ul><li>平均や  9...
まとめ <ul><ul><li>Maatkit  は便利で導入も簡単 </li></ul></ul><ul><ul><li>豊富なオプションと丁寧なドキュメント </li></ul></ul><ul><ul><li>なぜかエジプトっぽいロゴ <...
終わり
Upcoming SlideShare
Loading in …5
×

Maatkit で MySQL チューニング

3,203 views

Published on

Published in: Technology
  • Be the first to comment

Maatkit で MySQL チューニング

  1. 1. Maatkit で MySQL チューニング YAPC::Asia Tokyo 2010 前夜祭
  2. 2. 自己紹介 <ul><ul><li>金子 健介 (Kensuke Kaneko) </li></ul></ul><ul><ul><li>プログラマ @ ペパボ </li></ul></ul><ul><ul><li>刺身☆ブーメラン </li></ul></ul><ul><ul><li>id:a666666 </li></ul></ul><ul><ul><li>@kyanny </li></ul></ul>
  3. 4. Maatkit とは <ul><ul><li>MySQL 用のユーティリティ集 </li></ul></ul><ul><ul><li>作者は実践ハイパフォーマンス MySQL の著者 </li></ul></ul><ul><ul><li>なぜかエジプトっぽいロゴ </li></ul></ul><ul><ul><li>Perl スクリプトなので読みやすい </li></ul></ul><ul><ul><li>$ wc -l mk-* </li></ul></ul><ul><ul><li>  127964 total </li></ul></ul><ul><ul><li>( 12 万行もあるけど)読みやすい </li></ul></ul>
  4. 5. MySQL チューニングのいろは <ul><ul><li>EXPLAIN </li></ul></ul><ul><ul><li>SHOW INDEXES </li></ul></ul><ul><ul><li>スロークエリログ </li></ul></ul><ul><ul><li>mysqldumpslow </li></ul></ul><ul><ul><li>mk-query-digest </li></ul></ul><ul><ul><li>mk-query-profiler </li></ul></ul>
  5. 6. mk-query-digest <ul><ul><li>スロークエリログの統計データを表示 </li></ul></ul><ul><ul><ul><li>tcpdump の結果なども読めるらしい </li></ul></ul></ul><ul><ul><li>豊富なオプション </li></ul></ul><ul><ul><li>丁寧なドキュメント </li></ul></ul><ul><ul><ul><li>perldoc mk-query-digest </li></ul></ul></ul><ul><ul><ul><li>でかでかと RISKS と書いてあってびびる </li></ul></ul></ul>
  6. 7. 使い方 <ul><li>$ mk-query-digest --fingerprints slow.log </li></ul><ul><li># Files: slow.log </li></ul><ul><li># Overall: 115 total, 12 unique, 0.00 QPS, 0.03x concurrency _____________ </li></ul><ul><li>#                    total     min     max     avg     95%  stddev  median </li></ul><ul><li># Exec time          2323s      3s    338s     20s     49s     43s      5s </li></ul><ul><li># Lock time            6ms    22us   270us  55us    98us    31us    42us </li></ul><ul><li># Rows sent         22.92k       0     664   204.08  487.09  171.01  166.51 </li></ul><ul><li># Rows exam        730.08k    0 123.41k   6.35k  38.40k  18.22k  329.68 </li></ul><ul><li># Time range        2010-09-28 05:54:30 to 2010-09-29 04:00:47 </li></ul><ul><li># bytes             25.16k     134   2.45k  224.03  381.65  239.90  130.47 </li></ul><ul><li># Profile </li></ul><ul><li># Rank Query ID           Response time    Calls R/Call   Item </li></ul><ul><li># ==== ================== ================ ===== ======== ================ </li></ul><ul><li>#    1 0x5C552C534D2A3440  1114.2297 48.0%    17  65.5429 SELECT t3 </li></ul><ul><li>#    2 0xD9C2EFCBECC526D1   549.2743 23.6%    73   7.5243 SELECT t2 </li></ul><ul><li>#    3 0x0255F509DADB6455   457.1587 19.7%     9  50.7954 UPDATE t1 </li></ul><ul><ul><li>オプションはドットファイルに書いておける </li></ul></ul><ul><ul><li>t3 テーブルへのクエリが非常に遅い </li></ul></ul>
  7. 8. 結果の見方 <ul><li># Query 1: 0.00 QPS, 0.04x concurrency, ID 0x5C552C534D2A3440 at byte 3907 </li></ul><ul><li>#              pct   total     min     max     avg     95%  stddev  median </li></ul><ul><li># Count         14      17 </li></ul><ul><li># Exec time   47   1114s      3s    338s     66s    258s     96s     14s </li></ul><ul><li># Lock time     18     1ms    33us    86us    68us    80us    15us    73us </li></ul><ul><li># Rows sent    2     672      24      90   39.53   88.31   27.42   23.65 </li></ul><ul><li># Rows exam     50 372.21k     462  89.27k  21.89k  88.02k  30.14k   4.17k </li></ul><ul><li># Users                  1    test </li></ul><ul><li># Hosts                  1 </li></ul><ul><li># Databases          1    test </li></ul><ul><li># Time range 2010-09-28 05:54:30 to 2010-09-28 13:54:18 </li></ul><ul><li># bytes         15   3.97k     237     240  239.06  234.30       0  234.30 </li></ul><ul><ul><li>統計情報(全てのクエリ、個別のクエリ) </li></ul></ul><ul><ul><li> 注目すべき部分 </li></ul></ul><ul><ul><ul><li>Exec time </li></ul></ul></ul><ul><ul><ul><ul><li>これはとてもだめな例 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>平均 258 秒もかかっている </li></ul></ul></ul></ul>
  8. 9. mk-query-profiler <ul><ul><li>もう少し詳しい情報を知りたい </li></ul></ul><ul><ul><ul><li>例 : ディスク I/O がどれくらい発生しているか? </li></ul></ul></ul><ul><ul><ul><li>EXPLAIN だけではわからないことも多い </li></ul></ul></ul><ul><ul><li>プロファイリングツール </li></ul></ul><ul><ul><ul><li>SET profiling=1 </li></ul></ul></ul><ul><ul><ul><li>oprofile </li></ul></ul></ul><ul><ul><ul><li>mk-query-profiler </li></ul></ul></ul><ul><ul><li>mk-query-profiler の利点 </li></ul></ul><ul><ul><ul><li>導入が手軽 </li></ul></ul></ul><ul><ul><ul><ul><li>deb, rpm あります </li></ul></ul></ul></ul><ul><ul><ul><ul><li>スクリプト単体で入手可能 </li></ul></ul></ul></ul><ul><ul><ul><li>実行結果が見やすい </li></ul></ul></ul>
  9. 10. 使い方 <ul><li>$ mk-query-profiler -u user -D database -vv sql.txt </li></ul><ul><li>+----------------------------------------------------------+ </li></ul><ul><li>|                     1 (303.3715 sec)                     | </li></ul><ul><li>+----------------------------------------------------------+ </li></ul><ul><li>__ Overall stats _______________________ Value _____________ </li></ul><ul><li>   Total elapsed time                      303.372 </li></ul><ul><li>   Questions                             27350 </li></ul><ul><li>     COMMIT                                  0 </li></ul><ul><li>     DELETE                                  0 </li></ul><ul><li>     DELETE MULTI                          0 </li></ul><ul><li>     INSERT                                  0 </li></ul><ul><li>     INSERT SELECT                           0 </li></ul><ul><li>     REPLACE                                 0 </li></ul><ul><li>     REPLACE SELECT                          0 </li></ul><ul><li>     SELECT                                  1 </li></ul><ul><li>     UPDATE                                  0 </li></ul><ul><li>     UPDATE MULTI                            0 </li></ul><ul><li>   Data into server                        208 </li></ul><ul><li>   Data out of server                    39153 </li></ul><ul><li>   Optimizer cost                        17504.809 </li></ul><ul><ul><li>長いので以下略 </li></ul></ul>
  10. 11. 結果の見方 (1) <ul><ul><li>今回は I/O に関係しそうな部分を重点的にみた </li></ul></ul><ul><li>+----------------------------------------------------------+ </li></ul><ul><li>|                     1 (303.3715 sec)                     | </li></ul><ul><li>+----------------------------------------------------------+ </li></ul><ul><li>__ Row operations ____________________ Handler ______ InnoDB </li></ul><ul><li>   Reads                                                      92594           1816374 </li></ul><ul><li>__ I/O Operations _____________________ Memory ________ Disk </li></ul><ul><li>   InnoDB buffer pool </li></ul><ul><li>     Reads                                                  2474442              34106 </li></ul><ul><li>     Random read-aheads                                    390 </li></ul><ul><li>     Sequential read-aheads                                  36 </li></ul><ul><li>__ InnoDB Data Operations ____ Pages _____ Ops _______ Bytes </li></ul><ul><li>   Reads                                     44271         38091       725336064 </li></ul><ul><ul><li>ディスクからの読み込みが多い == 遅い </li></ul></ul>
  11. 12. 結果の見方 (2) <ul><ul><li>同じクエリのプロファイル結果(連続して実行) </li></ul></ul><ul><li>+----------------------------------------------------------+ </li></ul><ul><li>|                      1 (0.6755 sec)                      | </li></ul><ul><li>+----------------------------------------------------------+ </li></ul><ul><li>__ Row operations ____________________ Handler ______ InnoDB </li></ul><ul><li>   Reads                                                      92599              94843 </li></ul><ul><li>__ I/O Operations _____________________ Memory ________ Disk </li></ul><ul><li>   InnoDB buffer pool </li></ul><ul><li>     Reads                                                    323664                    0 </li></ul><ul><li>     Random read-aheads                                       0 </li></ul><ul><li>     Sequential read-aheads                                    0 </li></ul><ul><li>__ InnoDB Data Operations ____ Pages _____ Ops _______ Bytes </li></ul><ul><li>   Reads                                            0               0                     0 </li></ul><ul><ul><li>ディスクからの読み込みが減った </li></ul></ul><ul><ul><ul><li>バッファプール(メモリ)に載っているのではやい </li></ul></ul></ul>
  12. 13. mk-query-profiler は何をしているか <ul><ul><li>大半はオプションのパースと出力のフォーマット </li></ul></ul><ul><ul><li>実際に仕事をしてるのは get_status_info() </li></ul></ul><ul><li>sub get_status_info { </li></ul><ul><li>   my ( $o, $dbh, $have_session ) = @_; </li></ul><ul><li>   my $res = $dbh->selectall_arrayref( </li></ul><ul><li>       $have_session </li></ul><ul><li>         ? ($o->get('external') ? 'SHOW GLOBAL STATUS' : 'SHOW SESSION STATUS') </li></ul><ul><li>         : 'SHOW STATUS' ); </li></ul><ul><li>   my %result = map { @{$_} } @$res; </li></ul><ul><li>   return { map { $_ => $result{$_} || 0 } @important_vars }; </li></ul><ul><li>} </li></ul><ul><ul><li>SHOW STATUS の結果を整形してる </li></ul></ul>
  13. 14. プロファイル結果をふまえて <ul><ul><li>ディスクからのランダムリードが発生して遅くなっていた </li></ul></ul><ul><ul><li>Convering Index を使えるようにインデックスを追加した </li></ul></ul><ul><ul><ul><li>参考書籍 </li></ul></ul></ul><ul><ul><ul><ul><li>Linux-DB システム構築 / 運用入門 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>実践ハイパフォーマンス MySQL 第 2 版 </li></ul></ul></ul></ul><ul><ul><li>ブログにも少し書きました </li></ul></ul><ul><ul><ul><li>http://d.hatena.ne.jp/a666666/20100920/1284992435 </li></ul></ul></ul>
  14. 15. チューニング後 (1) <ul><li># Files: slow.log </li></ul><ul><li># Overall: 68 total, 8 unique, 0.00 QPS, 0.02x concurrency _______________ </li></ul><ul><li>#                    total     min     max     avg     95%  stddev  median </li></ul><ul><li># Exec time          1152s      3s     80s     17s     49s     18s      9s </li></ul><ul><li># Lock time            3ms    22us   312us    49us    84us    36us    38us </li></ul><ul><li># Rows sent         18.11k       0   1.45k  272.78  487.09  257.13  223.14 </li></ul><ul><li># Rows exam         75.33k       0  46.46k   1.11k   1.20k   5.33k  271.23 </li></ul><ul><li># Time range        2010-10-02 08:19:13 to 2010-10-03 04:00:46 </li></ul><ul><li># bytes             17.99k     134   4.02k  270.90  363.48  499.75  130.47 </li></ul><ul><li># Profile </li></ul><ul><li># Rank Query ID           Response time    Calls R/Call   Item </li></ul><ul><li># ==== ================== ================ ===== ======== ================ </li></ul><ul><li>#    1 0xD9C2EFCBECC526D1   644.6672 55.9%    51  12.6405 SELECT t2 </li></ul><ul><li>#    2 0x0255F509DADB6455   357.9470 31.1%     7  51.1353 UPDATE t1 </li></ul><ul><li>#    3 0xE4D15EB8FF64B268    45.1097  3.9%     5   9.0219 SELECT t3 </li></ul><ul><ul><li>t3 テーブルへのクエリに改善がみられた </li></ul></ul>
  15. 16. チューニング後 (2) <ul><li># Query 3: 0.01 QPS, 0.10x concurrency, ID 0xE4D15EB8FF64B268 at byte 6136 </li></ul><ul><li>#              pct   total     min     max     avg     95%  stddev  median </li></ul><ul><li># Count          7       5 </li></ul><ul><li># Exec time      3     45s      6s     12s      9s     12s      2s      8s </li></ul><ul><li># Lock time      8   285us    39us    90us    57us    89us    18us    47us </li></ul><ul><li># Rows sent     0     120      24      24      24      24       0      24 </li></ul><ul><li># Rows exam   5   4.20k     586    1006     861  964.41  144.29  918.49 </li></ul><ul><li># Users                  1    test </li></ul><ul><li># Hosts                  1 </li></ul><ul><li># Databases          1    test </li></ul><ul><li># Time range 2010-10-02 15:59:14 to 2010-10-02 16:06:35 </li></ul><ul><li># bytes          9   1.69k     346     346     346     346       0     346 </li></ul>
  16. 17. 考察 <ul><ul><li>mk-query-digest について </li></ul></ul><ul><ul><ul><li>統計情報をすばやく把握 </li></ul></ul></ul><ul><ul><ul><li>平均や 95% など情報量が多い </li></ul></ul></ul><ul><ul><ul><ul><li>慣れるまではちょっと多すぎるかも </li></ul></ul></ul></ul><ul><ul><li>mk-query-profiler について </li></ul></ul><ul><ul><ul><li>より詳細なデータが取得できる </li></ul></ul></ul><ul><ul><ul><ul><li>SHOW STATUS や SHOW ENGINE INNODB STATUS も大事ですね </li></ul></ul></ul></ul><ul><ul><ul><li>「 たぶん ディスク読み込みが遅いんでメンテします」とか言わずに済む </li></ul></ul></ul><ul><ul><ul><li>仮説、調査、裏付け(!)、実行 </li></ul></ul></ul><ul><ul><ul><li>自信をもってチューニングに取り組める </li></ul></ul></ul>
  17. 18. まとめ <ul><ul><li>Maatkit は便利で導入も簡単 </li></ul></ul><ul><ul><li>豊富なオプションと丁寧なドキュメント </li></ul></ul><ul><ul><li>なぜかエジプトっぽいロゴ </li></ul></ul><ul><ul><li>MySQL チューニングのお供にぜひどうぞ </li></ul></ul><ul><ul><ul><li>参考 </li></ul></ul></ul><ul><ul><ul><ul><li>http://www.maatkit.org/ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>http://code.google.com/p/maatkit/ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>http://d.hatena.ne.jp/marqs/20100515/1273861805 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>http://d.hatena.ne.jp/hxmasaki/20100726/1280117979 </li></ul></ul></ul></ul>
  18. 19. 終わり

×