How to profileyour MySQL?
● innotop
●
Query List("Q")
● InnoDB Row Ops("R")
● InnoDB Txns("T")
●
InnoDB Lock Waits("K")
●
Locks("L")
●
Variables & Status("S")
– Choose a set of values("s")
– Enter variables for commands("e")
– 自分でカスタムできるっぽいけどやってない
● InnoDB I/O Info("I")
8.
How to profileyour MySQL?
● mysqladmin ex -r -i 2 | grep ..
●
差分だけちゃきちゃき流しっぱにする
● そこにだけ気を取られて他の数値が跳ね上がったり
すると orz
●
mysql -Ee "SHOW ENGINE INNODB STATUS" |
tee >(grep --color -i pending)
● pending なんちゃらだけ見ていたいけど、 pending
なんちゃらが出てた時には他の出力も見たい
●
gdb -ex "set pagination 0" -ex "thread
apply all bt" -batch -p `pidof mysqld`
● 世界が止まるので注意
●
perf top と同じくたしなみ
9.
How to profileyour MySQL?
● SELECT table_name, index_name,
SUM(number_records) AS record,
SUM(data_size) AS datasize FROM
information_schema.innodb_buffer_page
GROUP BY 1, 2;
● 使ってるはずなのに載ってないインデックスとかあ
ると泣ける
● SELECT free_page_clock, count(*) FROM
information_schema.innodb_buffer_page
GROUP BY 1;
●
何回そのページが free されたか
● ずっと載りっぱなしの領域と、どんどん LRU Flush
される領域の数の把握
10.
How to profileyour MySQL?
● pager grep -v Sleep からの SHOW FULL
PROCESSLIST;
● だいたい State 見る
● Waiting for query cache lock に出会うこと多い
● cmake -DENABLE_GPROF=ON
● gprof をオンにしてコンパイル
●
複数スレッドの劣化が激しすぎて微妙だった
●
正常終了時、 datadir に gmon.out を作るの
で、 gprof bin/mysqld data/gmon.out で食わせる
How to profileyour MySQL?
● SET profiling= 1; <Query>; SHOW PROFILE;
●
問題のクエリーが判ってて、再現性がある場合
● Status の意味が判らないときはソースコードから
探す
●
EXPLAIN ..
● 「ある程度判ってる人」が見た後でも key_len と
Extra は見ておく
● possible_keys が見づらくなるから、インデックス
にはわかりやすい名前を付けてほしいなー
13.
How to profileyour MySQL?
● SET SESSION optimizer_trace= 'enabled=on';
<Query>; SELECT * FROM
information_schema.optimizer_traceG
●
実はあんまり見たことない
● ps_helper(sys schema)
●
statements_with_full_table_scans とか
statements_with_temp_tables とか
statements_with_sorting とか
schema_unused_indexes とか、名前を聞くだけでス
テキそうでしょ?
● https://github.com/MarkLeith/mysql-sys
14.
How to profileyour MySQL?
● MySQL Workbench 6.1
●
ps_helper の後継になる sys スキーマを作れる
– sys スキーマには i_s を食う VIEW も追加されてる
● しかもマウスでポチポチできて見やすい
●
perfornamce_schema
● SELECT event_name, source, timer_wait/ 1000/
1000/ 1000 AS timer_wait FROM
events_stages_history WHERE thread_id= (SELECT
thread_id FROM threads WHERE processlist_id=
310) ORDER BY timer_start;
●
profiling が deprecated になってしまったのでそ
の代替えぽく思ってるやつ
● http://bugs.mysql.com/bug.php?id=72130