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.

MySQLerの7つ道具 plus

5,817 views

Published on

2017/01/25 MyNA(日本MySQLユーザ会)会 2017年1月

Published in: Technology
  • Be the first to comment

MySQLerの7つ道具 plus

  1. 1. MySQLerの七つ道具 Plus Youʼre not alone 2017/01/25 yoku0825 ⽇本MySQLユーザ会(MyNA)会 2017年1⽉
  2. 2. 本編に⼊ る前に 1/98
  3. 3. @yyamasaki1 「MySQL ClusterはMySQL の姉妹製品」 2/98
  4. 4. Myちゃんの 姉妹と⾔えば 3/98
  5. 5. Mariaち ゃん 4/98
  6. 6. 宿命のライバル(︖) http://www.slideshare.net/Codemotion/my-sql- mariadbstorycodemotion 5/98
  7. 7. そしてこれが舞奈たん https://github.com/yoku0825/MyNA/tree/master/ unofficial̲myna̲girl 6/98
  8. 8. 舞奈たん is 誰 ⽇本MySQLユーザ会 MySQL Nippon Association MyNA(まいな) マイナ(九官⿃の仲間︖) MyNAのロゴはマイナ 7/98
  9. 9. マイナくん(仮) https://github.com/yoku0825/MyNA/tree/master/ yet̲another̲logo 8/98
  10. 10. 舞奈たん マイナくん(仮) (仮)なのは俺がこのロゴの本名を知らないから- まいな 舞奈︖ マイナくん(仮)の擬⼈化なので緑 9/98
  11. 11. はい今⽇のいち ばんおもしろい とこ終わった 10/98
  12. 12. \こんばんは/ yoku0825@とある企業のDBA オラクれない- ポスグれない- マイエスキューエる- ⽣息域 Twitter: @yoku0825- Blog: ⽇々の覚書- MyNA ML: ⽇本MySQLユーザ会- MySQL Casualʼs Slack: MySQL Casual- 11/98
  13. 13. 本が出ました http://book.impress.co.jp/books/1116101077 12/98
  14. 14. が 13/98
  15. 15. 目次 第 1 章 MySQL クエリーチューニングことはじめ 第 2 章 スローログの集計に便利な「pt-query-digest」 を使ってみよう 第 3 章 SQL 実⾏計画の疑問解決には「とりあえず EXPLAIN」しよう 第 4 章 「PMP for Cacti」で MySQL のステータスを可 視化する 14/98
  16. 16. 目次 第 5 章 MySQL のリアルタイムモニタリングに innotop 第 6 章 再現性のあるスロークエリーには「SHOW PROFILE」を試してみよう 第 7 章 performance̲schema を sys で使い倒す 第 8 章 MySQL のチューニングを戦う⽅へ 15/98
  17. 17. 実はいっこもクエリチューニングしてない  MySQL (で) 即効クエリチューニング (をしたくてしょ うがない⼈はまずこのへんから⾒ると対象が絞り込みやすい しチューニングのためにインデックスを作る時はこんなのモ ニタリングしたらいいし、中⻑期的にチューニングの効果測 定するならこんなツールがいいんじゃね︖) みたいな 正直すまんかった 16/98
  18. 18. この本は 200台のMySQLの⾯倒を⾒ないといけない 1台にかけられる時間は限られていて チューニング以外にもやることはもちろんある そんな企業のDBAに 17/98
  19. 19. この本は チューニングのために pt-online-schema-change を流してみ たけど binlog_format= MIXED がROWフォーマットにフォールバッ クされてレプリケーションぶっ壊れてあがががが っていうのに気付くのが遅れたDBAとか 18/98
  20. 20. この本は JOINする時に何故かインデックスが上⼿く使われなくて どういうことだと思ってプロファイルを取ってみたら 暗黙の型変換が⾛ってスキャンジョインになっていることに たどり着いて ちょっと嬉しくなるDBAとか 19/98
  21. 21. 要は4年前の俺 にオススメな 20/98
  22. 22. MySQLer七つ 道具のはなし 21/98
  23. 23. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 22/98
  24. 24. + more Perl に限らず、ワンライナーでゴニョゴニョできる⼿になじむ⾔語- Docker に限らず、好きなように作って壊せる環境- あとTwitter 「〜ってなんだったっけ︖」とつぶやくと30秒で答えが返ってくる 悪 夢のようなツール - 23/98
  25. 25. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 24/98
  26. 26. pt-query-digest みんなだいすきPercona Toolkitの⼈気No.1 スローログをまとめて⾒やすくしてくれる ⼤⽂字⼩⽂字、⽂字列定数と数値定数をノーマライズして「ダイジェ スト」ごとに集約 - 25/98
  27. 27. 先頭のセクション $ pt-query-digest /path/to/slowlog .. # Time range: 2016-03-16 17:29:32 to 2016-11-22 11:37:24 # Attribute total min max avg 95% stddev median # ============ ======= ======= ======= ======= ======= ======= ======= # Exec time 45155s 500ms 117s 3s 7s 9s 640ms # Lock time 2s 29us 14ms 110us 176us 136us 93us # Rows sent 156.96M 0 5.85M 10.33k 54.03k 74.89k 0.99 # Rows examine 36.18G 0 26.40M 2.38M 22.38M 5.41M 298.06k # Rows affecte 0 0 0 0 0 0 0 # Bytes sent 9.86G 0 362.91M 664.55k 4.26M 4.87M 1.09k # Query size 3.29M 25 24.47k 221.80 346.17 425.46 136.99 .. 26/98
  28. 28. まああんま⾒ない…けど この出⼒結果をパースして管理⽤MySQLに突っ込んでる 前⽇⽐どれくらいスローログが増えたかを確認するのに使っ てる SHOW GLOBAL STATUS LIKE 'Slow_queries' の増分を取るよりはもう ちょっとグラフ化して⾯⽩い程度に取れる - ここで「おや︖」と思ったら深掘り(anemo eat er)開始 なので実はこれ以降あんまり⽣の pt-query-digest は⾒ない- 27/98
  29. 29. anemo eat erの前に、Anemometerのはなし pt-query-digest の出⼒結果を可視化するツール pt-query-digest の結果をMySQLに⼊れる機能(--history, --review)をそのまま使ってる box/Anemometer: Box SQL Slow Query Monitor 28/98
  30. 30. Anemometerの弱点 テーブル上UNIQUE KEY (hostname_max, checksum, ts_min, ts_max)で、Anemometerはts_minでプロットするため、そ のクエリーがts_minに集中したことになってしまう。 mysql> SELECT * FROM global_query_review_history LIMIT 1G *************************** 1. row *************************** hostname_max: xxx db_max: xxx checksum: 1233945238822708500 sample: xxx ts_min: 2015-09-14 11:32:12 ts_max: 2015-10-28 15:51:01 ts_cnt: 31 Query_time_sum: 651.778 Query_time_min: 2.07993 Query_time_max: 197.678 29/98
  31. 31. Anemometerの弱点 ⽇次で pt-query-digest を回している程度だと、⽇単位までし か分解できない 30/98
  32. 32. そこでanemo eat er スローログをスプリットして pt-query-digest を呼びまくる 1分ぶんずつ pt-query-digest に⾷わせれば、ts_min と ts_max の差 は最⼤でも1分 - AnemometerをDockerコンテナーとして起動する- 既存のAnemometerがあれば単にスローログを分割して⾷わせる pt- query-digest のラッパーとして呼べる - 31/98
  33. 33. with anemo eat er 最⼩1分単位でプロットできる 32/98
  34. 34. anemo eat er リアルタイムでなくてもいい スロークエリーのリアルタイム通知は別の⽅法でしてる- グラフで⾒られれば数分前の情報であっても全然構わない- リアルタイムを捨てて 保存期間を考えない スローログが残っている限りの情報を、最初から、最後まで⾒られる - ⾒るかどうかもわからないグラフのために常時リソースを割かなくて いい ⾒たく / ⾒せたく なったら起動、⾒終わったら停⽌ - 33/98
  35. 35. anemo eat er 現在のところ docker と pt-query-digest はホストにインス トールしておかないとダメ $ git clone https://github.com/yoku0825/anemoeater $ cd anemoeater $ ./anemoeater slow_log_file Docker container starts with 172.17.0.43. URL will be http://xxxx:32780/anemometer 34/98
  36. 36. With anemo eat er $ scp -c arcfour target_server:/data/../slow.log ./target_server_ slow.log $ ./anemoeater target_server_slow.log Docker container starts with 172.17.0.3. URL will be http://192.168.230.241:32789/anemometer processing 2016-12-16 01:08:00 at target_server_slow.log. .. デフォルトでは直近1か⽉分をCPUスレッド数 * 1.5 パラレ ルにして5分単位で分割する 35/98
  37. 37. 何はなくともグラフ画⾯ 36/98
  38. 38. “Show top queries as a separate series” 37/98
  39. 39. じゃん 38/98
  40. 40. Query̲time以外でも描画できる 39/98
  41. 41. ⾒るところは⽣の pt-query-digest とそうそう違わない クエリーごとにバラつきがあるか︖ バラついているなら、カーディナリティーの悪戯か、それともキャッ シュの具合か 特にInnoDB圧縮を使ってる場合、バッファプールミスヒットやテーブルキャッシュミ スヒットのコストは⼤きい - 均等に遅いなら、それはクソクエリーかな- ただし pt-query-digest がそもそも、スローログに載っているヤーツ しか⾒られない以上、まともな速度で応答を返しているヤーツは検出 されない - 詳細画⾯の “samples” から⽣のクエリーも⾒られる 40/98
  42. 42. ⽣のpt-query-digestと上⼿く付き合うコツ --since オプションはほぼ必須 --since オプションでもログは舐めてしまうので、⼤きなログを⾷わ すのであれば tail -50000 slow.log | pt-query-digest とパイプで ⾷わせるのも⼿ - 「膨⼤で⾒にくいスローログの塊を、認識しやすいチャンク にまとめる」 --group-by=tables からの --group-by=fingerprint -- filter='$events->{fingerprint} =~ /sテーブル名s/' とか - 41/98
  43. 43. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 42/98
  44. 44. EXPLAIN もうみんな 目XPLAIN とかできるんでしょう︖ EXPLAIN EXTENDED EXPLAIN format=json の話しかしません 43/98
  45. 45. EXPLAIN EXTENDED 5.7からはデフォルトでEXTENDED & PARTITIONSがつい てくる EXPLAIN直後に SHOW WARNINGS でオプティマイザーが最適化した後 のクエリーが⾒える - 5.6まではEXTENDEDとPARTITIONSを同時に指定できなかったけ ど、5.7はまとめて出してくれる - 想像したのと違う遅くなり⽅ をしたらEXTENDED⾒た⽅が 良い 特に5.6の蝉ジョインとか蝉ジョインとか蝉ジョインとか- MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.8.3 EXPLAIN EXTENDED 出⼒フォーマット 44/98
  46. 46. EXPLAIN EXTENDED *************************** 1. row *************************** id: 1 select_type: SIMPLE table: hg type: ref possible_keys: PRIMARY,hogehoge_idx05,hogehoge_idx09,hogehoge_idx10,hogehoge_idx11,hogehoge_idx12,ho gehoge_idx13,hogehoge_idx14,hogehoge_idx15,hogehoge_idx16,hogehoge_idx17,hogehoge_idx19,idx_col2_col 3_col1 key: hogehoge_idx05 key_len: 5 ref: const rows: 170287 filtered: 100.00 Extra: Using index condition; Using where; Using temporary; Using filesort *************************** 2. row *************************** id: 1 select_type: SIMPLE table: fg type: ref possible_keys: fugafuga_idx1,idx_fugafuga_04,idx_col1_col2_col3 key: idx_fugafuga_04 key_len: 7 ref: hg.col2,const rows: 5 filtered: 100.00 Extra: Using index 2 rows in set, 1 warning (0.00 sec) 45/98
  47. 47. SHOW WARNINGS *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select `fg`.`fugafuga_id` AS `fugafuga_id `,`hg`.`col3` AS `col3`,`hg`.`title` AS `hogehoge_title`,`hg`.`co l2` AS `col2`,`hg`.`col4` AS `col4`,`hg`.`fugafuga_count` AS `fug afuga_count` from `fugafuga` `fg` join `hogehoge` `hg` where ((`f g`.`col1` = `hg`.`col2`) and (`hg`.`col2` = 210) and (`hg`.`col2 ` = 1) and (`fg`.`col5` = 1) and (`hg`.`col6` in (0,100,101))) or der by `fg`.`fugafuga_id` desc limit 0,5 46/98
  48. 48. オプティマイザーを通した後の情報 想像したのと違う遅くなり⽅をしたら <semi-join> とか <materialized> とか⾒えて楽しい 47/98
  49. 49. EXPLAIN format=json EXPLAIN: { "query_block": { "select_id": 1, "ordering_operation": { "using_temporary_table": true, "using_filesort": true, "nested_loop": [ { "table": { .. "rows": 170287, "filtered": 100, "index_condition": "(`hg`.`col2` is not null)", "attached_condition": "((`hg`.`col2` = 1) and (`hg`.` col6` in (0,100,101)))" } .. } 1 row in set, 1 warning (0.00 sec) 48/98
  50. 50. format=JSON ICPな時にどこにICP当ててるのかが⾒える くらいであんまり⾒ることはないけど Visual Explainのタネ 正直これなら optimizer_trace ⾒た⽅が楽しい 49/98
  51. 51. Visual EXPLAIN JSON⽂字列から直接これが描写できればいいのに 50/98
  52. 52. optimizer_trace > SELECT * FROM information_schema.optimizer_traceG *************************** 1. row *************************** QUERY: .. TRACE: { "steps": [ { "join_preparation": { "select#": 1, "steps": [ { "expanded_query": .. { "join_optimization": { "select#": 1, "steps": [ { "transformations_to_nested_joins": { "transformations": [ "outer_join_to_inner_join", "JOIN_condition_to_WHERE", "parenthesis_removal" ], .. { "index": "hogehoge_idx18", "usable": false, "cause": "not_applicable" }, MISSING_BYTES_BEYOND_MAX_MEM_SIZE: 22143 INSUFFICIENT_PRIVILEGES: 0 51/98
  53. 53. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 52/98
  54. 54. PMP(Percona Monitoring Plugins) for Cacti 別に for Zabbixでもいいと思う 単にウチはもともとCactiを使っていたからというだけ 既にカスタマイズしたぷらぎんもあるし 53/98
  55. 55. PMP for Cacti rrdtoolだから容量効率は素晴らしい rrdtoolだから丸め誤差は厳しい CactiそのものがWEBからポチポチするインターフェースな のつらい ss̲get̲mysql̲stats.php ⾃体はPHPで、頑張って⾊々パー スしてるので、ホゲろうと思えばホゲれる けど、それならPerlで書きたい- 54/98
  56. 56. PMP for Cactiといえば https://www.percona.com/doc/percona-monitoring- plugins/1.1/cacti/mysql-templates.html 55/98
  57. 57. Data Input Methodのデフォルトを⼀気にSQLで書き換 えるとか mysql> UPDATE data_input_fields JOIN data_input_data ON data_input_fields.id= data_i nput_data.data_input_field_id JOIN data_input ON data_input_fields.data_input_id = d ata_input.id -> SET data_input_data.value = 'pmp' WHERE data_input.name LIKE 'Percona %' AND data_input_fields.name = 'Username'; mysql> UPDATE data_input_fields JOIN data_input_data ON data_input_fields.id= data_i nput_data.data_input_field_id JOIN data_input ON data_input_fields.data_input_id = d ata_input.id -> SET data_input_data.value = 'pmp_pass' WHERE data_input.name LIKE 'Percona % ' AND data_input_fields.name = 'Password'; mysql> UPDATE data_input_fields JOIN data_input_data ON data_input_fields.id= data_i nput_data.data_input_field_id JOIN data_input ON data_input_fields.data_input_id = d ata_input.id -> SET data_input_data.value = '3306', data_input_data.t_value = 'on' WHERE data _input.name LIKE 'Percona %' AND data_input_fields.name = 'Port'; 56/98
  58. 58. Device追加する時にポートを⼀⻫に変えるブックマーク レットだとか javascript:void((function(elems,port){for(var p in elems){elems[p ].value=port}})(document.querySelectorAll('input[type=text]'),pro mpt('port','3306'))) (c) irok 57/98
  59. 59. 最近ちょっとPMM (Percona Monitoring and Management)試し たい オレオレぷらぎんがどれくらい移植し やすいか次第 58/98
  60. 60. PMP for Cacti やっぱり視認性だいじ たまには⻑い期間で⾒る 「プラグインを⾃分で書きやすいこと」も⼤事 企業体⼒のある某社 さん是非︕- 59/98
  61. 61. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 60/98
  62. 62. innotop みんな⼤好き、topライクに SHOW PROCESSLIST を表⽰して くれるinnotop 地味に “M” (Replication Status) も便利 なんとMSR対応してるんだぜ - “L” (InnoDB Locks) とか- “T” (InnoDB Transaction) とか- “M”(Replications) も便利だな- pt-osc してる間だと “D” (InnoDB Deadlocks) を眺めることもある- tmuxでばっちんばっちんターミナル割って、 dstat とか流 しながら⾒るのが好き 61/98
  63. 63. innotop 62/98
  64. 64. innotop 地味に機能は多いけど今のバージョンだと表⽰されない項目 がたまにある 旧バージョンのサポート切れば楽なんだけど…と思ったり思わなかっ たり - ALTER TABLE や percona-toolkit で重いことやる時のおとも に最適 “d” で表⽰間隔の変更。0.1とかやるとたのしい- ただし万能感を期待しない- “Q” => “K” => “T” => “k” (killステートメント) のコンボで詰まっ てるのを殺すくらい - 63/98
  65. 65. innotop 中⾝は結構スパゲティ 最近メンテナンス遅め ちょっと⾊々事情が- ⽇々の覚書: innotopのその後 2016年6⽉- ちょうど先週 (JSTで1/21) 息を吹き返したところ 1.11.4 が出てる epelへのリクエストは出した Bug 1416245 – Package update request for innotop v1.11.4 - 64/98
  66. 66. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 65/98
  67. 67. SHOW PROFILE MySQLの組み込みプロファイラー 「そのクエリーが実⾏されていた期間、どのStatus(SHOW PROCESSLIST で “State” と表⽰されているもの)にどのくら いの時間かかったか 使うのが超簡単 66/98
  68. 68. SHOW PROFILE mysql> SET @@profiling= 1; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> ..; mysql> SHOW PROFILE; +----------------------+----------+ | Status | Duration | +----------------------+----------+ | starting | 0.000206 | | checking permissions | 0.000024 | | Opening tables | 0.000039 | | init | 0.000089 | | System lock | 0.000027 | | optimizing | 0.000037 | | statistics | 0.000245 | | preparing | 0.000058 | | Creating tmp table | 0.000119 | | Sorting result | 0.000023 | | executing | 0.000019 | | Sending data | 2.619037 | | Creating sort index | 0.000821 | | end | 0.000014 | | removing tmp table | 0.000017 | | end | 0.000013 | | query end | 0.000015 | | closing tables | 0.000022 | | freeing items | 0.000028 | | logging slow query | 0.000109 | | cleaning up | 0.000013 | +----------------------+----------+ 21 rows in set (0.00 sec) 67/98
  69. 69. SHOW PROFILE 組み込みだから使うのは超簡単 プロファイルを「どう解析するか」はまた別の問題 ざっと⾒てわかりやすいところに時間がかかってたらつぶせ る…くらいのノリ 再現性がないとつらい 再現性無いなら無いで、テーブルキャッシュやバッファプールのミス ヒットに視線を移すことはできるなあ - 68/98
  70. 70. MySQL 5.6でdeprecated 代替として performance_schema.events_stages_* と events_statements_* が案内されている…けど @@profiling はセッション単位に対して、p̲sはセッション 単位の調整がちょっと難しい ⼀応、MySQL 8.0.0現在でもまだ使える Please “Affects me”!! MySQL Bugs: #81928: Feature request for sys.profiling- 69/98
  71. 71. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 70/98
  72. 72. performance̲schema(p̲s) パフォーマンスモニタリング専⽤のストレージエンジン MySQL 5.6から真っ当に使えるようになってる 吊るしのデフォルトではONになってる- 計測する項目も「だいたい必要になりそうなところ」だけがONになっ てるので、必要になるまではそのまま使えばOK - メモリーを⾷うのは相変わらず デフォルトがautosizeなので、気になる場合は固定値を決め打つ- しかも5.7のデフォルトが auto re size になりやがった。。- 71/98
  73. 73. p̲s⾃体のモニタリング mysql> SHOW ENGINE PERFORMANCE_SCHEMA STATUS; +--------------------+------------------------------------------------------------- +----------+ | Type | Name | Status | +--------------------+------------------------------------------------------------- +----------+ | performance_schema | events_waits_current.size | 176 | | performance_schema | events_waits_current.count | 1536 | | performance_schema | events_waits_history.size | 176 | | performance_schema | events_waits_history.count | 2560 | | performance_schema | events_waits_history.memory | 450560 | .. | performance_schema | performance_schema.memory | 94739320 | +--------------------+------------------------------------------------------------- +----------+ 229 rows in set (0.00 sec) 72/98
  74. 74. 最近お気に⼊りのp̲sクエリー SELECT thread_id, event_name, sql_text, @progress:= (work_completed / work_estimated) * 100 AS progress, @elapsed:= (timer_current - timer_start) / power(10, 12) AS elapsed, @elapsed * (100 / @progress) - @elapsed AS estimated FROM (SELECT stage.thread_id, stage.event_name, work_completed, work_estimated, (SELECT timer_start FROM events_statements_current JOIN threads USING(thread_id) WHERE processlist_id = @@pseudo_thread_id) AS timer_current, statement.timer_start, sql_text FROM events_stages_current AS stage JOIN events_statements_current AS statement USING(th read_id) ) AS dummy; ⽇々の覚書: MySQL 5.7.6のPerformance Schemaで InnoDBのALTER TABLE進捗どうですか 73/98
  75. 75. ALTER TABLE が⾒える…⾒えるぞ… mysql> SELECT ..; +-----------+------------------------------------------------------+-------------------------------------+-------------+-------------+--------------------+ | thread_id | event_name | sql_text | progress | elapsed | estimated | +-----------+------------------------------------------------------+-------------------------------------+-------------+-------------+--------------------+ | 28 | stage/innodb/alter table (read PK and internal sort) | ALTER TABLE t1 ADD UNIQUE KEY (val) | 7.330386000 | 1.877416142 | 23.734006530694177 | +-----------+------------------------------------------------------+-------------------------------------+-------------+-------------+--------------------+ 1 row in set (0.15 sec) mysql> SELECT ..; +-----------+------------------------------------------------------+-------------------------------------+--------------+--------------+------------------+ | thread_id | event_name | sql_text | progress | elapsed | estimated | +-----------+------------------------------------------------------+-------------------------------------+--------------+--------------+------------------+ | 28 | stage/innodb/alter table (read PK and internal sort) | ALTER TABLE t1 ADD UNIQUE KEY (val) | 46.969643300 | 33.385053874 | 37.6928839778295 | +-----------+------------------------------------------------------+-------------------------------------+--------------+--------------+------------------+ 1 row in set (0.01 sec) mysql> SELECT ..; +-----------+---------------------------------------+-------------------------------------+--------------+--------------+--------------------+ | thread_id | event_name | sql_text | progress | elapsed | estimated | +-----------+---------------------------------------+-------------------------------------+--------------+--------------+--------------------+ | 28 | stage/innodb/alter table (merge sort) | ALTER TABLE t1 ADD UNIQUE KEY (val) | 50.831565800 | 40.169081343 | 38.854810033960106 | +-----------+---------------------------------------+-------------------------------------+--------------+--------------+--------------------+ 1 row in set (0.00 sec) mysql> SELECT ..; +-----------+-----------------------------------+-------------------------------------+--------------+--------------+--------------------+ | thread_id | event_name | sql_text | progress | elapsed | estimated | +-----------+-----------------------------------+-------------------------------------+--------------+--------------+--------------------+ | 28 | stage/innodb/alter table (insert) | ALTER TABLE t1 ADD UNIQUE KEY (val) | 83.429283200 | 61.092267798 | 12.134140789914134 | +-----------+-----------------------------------+-------------------------------------+--------------+--------------+--------------------+ 1 row in set (0.00 sec) 74/98
  76. 76. sys p̲sの情報を⾒やすくするためのビューやストアドファンク ション、ストアドプロシージャ MySQL 5.7.7 and higher includes the sys schema, a set of objects that helps DBAs and developers interpret data collected by the Performance Schema. https://dev.mysql.com/doc/refman/5.7/en/sys- schema.html 75/98
  77. 77. sysのインストール(5.6向け) $ git clone https://github.com/mysql/mysql-sys.git Initialized empty Git repository in /root/mysql-sys/.git/ remote: Counting objects: 3009, done. remote: Total 3009 (delta 0), reused 0 (delta 0), pack-reused 3008 Receiving objects: 100% (3009/3009), 1.17 MiB | 466 KiB/s, done. Resolving deltas: 100% (1768/1768), done. $ cd mysql-sys $ mysql -uroot -p < sys_56.sql $ mysql -uroot -p mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec) 76/98
  78. 78. ⾖知識 MySQL 5.7の mysql_install_db には --skip-sys-schema オ プションがある https://dev.mysql.com/doc/refman/5.7/en/mysql-install- db.html#option̲mysql̲install̲db̲skip-sys-schema - mysql_upgrade にもある https://dev.mysql.com/doc/refman/5.7/en/mysql- upgrade.html#option̲mysql̲upgrade̲skip-sys-schema - 77/98
  79. 79. statement_analysis, innodb_lock_waits 超⾒やすい これのためだけに p̲s と sys 有効にする価値がある が、もうさんざん⾔ってきたので詳しくはおググりください ちなみにこれ以外にも、GithubのREADME が⼀番出⼒例が 多くて良いと思う 78/98
  80. 80. ps_truncate_all_tables ストアド p̲s は起動時から統計情報を累積するが、それをリセットす るにはp̲sの各テーブルに対してTRUNCATEが必要 それを全部まとめてやってくれる、ただそれだけなんだけど 便利なストアド mysql> CALL sys.ps_truncate_all_tables(0); +---------------------+ | summary | +---------------------+ | Truncated 44 tables | +---------------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) 79/98
  81. 81. create_synonym_db ストアド SHOW TABLES FROM .. の結果をそのまま新しいスキーマに CREATE VIEW .. AS SELECT * FROM .. するという雑な作り p_s と i_s を作るのにすごく便利だ mysql> CALL sys.create_synonym_db('performance_schema', 'p_s'); +----------------------------------------+ | summary | +----------------------------------------+ | Created 87 views in the `p_s` database | +----------------------------------------+ 1 row in set (0.35 sec) Query OK, 0 rows affected (0.35 sec) mysql> use p_s Database changed mysql> SHOW TABLES; .. 80/98
  82. 82. MySQLer七つ道具 pt-query-digest1. EXPLAIN2. PMP for Cacti3. innotop4. SHOW PROFILE5. performance̲schema & sys6. ???7. 81/98
  83. 83. Oracle MySQLでベ ンチマークおじさん している Dimitri を ご存知の⽅︖ 82/98
  84. 84. 「俺が (⽇本の) Dimitriだ」っ て⽅︖ 83/98
  85. 85. Dimitri KRAVTCHUK 84/98
  86. 86. Dimitriおじさん says 85/98
  87. 87. Dimitriおじさん says 86/98
  88. 88. Dimitriおじさん says 87/98
  89. 89. Thatʼs right, WE USE OUR BRAINs 88/98
  90. 90. こんなおじさんになりたい 89/98
  91. 91. こんなおじさんにいてほしい 90/98
  92. 92. みなさんのご参加をお待ちしております :) MyNA ML: ⽇本MySQLユーザ会 MySQL Casualʼs Slack: MySQL Casual 91/98
  93. 93. MySQL Casual Talks vol.10 もっと深く浅く、広く狭くMySQLを使っていこうとい う趣旨のイベントです。 多⽅⾯から多様なMySQLの使い⽅、運⽤、Tipsなどな どのTalkを集めたいと思っております。 http://mysql-casual-slackin.herokuapp.com/ から Slackチャンネルへjoinできますので、ご参加くださ い。 92/98
  94. 94. え︖ もう補⽋ 出てるって︖ 93/98
  95. 95. やだなあ まだ3枠余ってるじゃんすか(2017/01/25 18:00現在) 94/98
  96. 96. まあ冗談ではなく 95/98
  97. 97. 既に持っている⽅、買 ってくれた⽅、よろし ければどうぞ :) @myfinder まで︕ 96/98
  98. 98. 旅は道連れ 世は情け 97/98
  99. 99. Questions and/or Suggestions? 98/98

×