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