MySQLerの7つ道具 plus

4.816 visualizaciones

Publicado el

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

Publicado en: Tecnología
  • Sé el primero en comentar

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

×