SlideShare ist ein Scribd-Unternehmen logo
1 von 99
Downloaden Sie, um offline zu lesen
MySQLerの七つ道具 Plus
Youʼre not alone
2017/01/25
yoku0825
⽇本MySQLユーザ会(MyNA)会 2017年1⽉
本編に⼊
る前に
1/98
@yyamasaki1
「MySQL
ClusterはMySQL
の姉妹製品」
2/98
Myちゃんの
姉妹と⾔えば
3/98
Mariaち
ゃん
4/98
宿命のライバル(︖)
http://www.slideshare.net/Codemotion/my-sql-
mariadbstorycodemotion
5/98
そしてこれが舞奈たん
https://github.com/yoku0825/MyNA/tree/master/
unofficial̲myna̲girl 6/98
舞奈たん is 誰
⽇本MySQLユーザ会
MySQL Nippon Association
MyNA(まいな)
マイナ(九官⿃の仲間︖)
MyNAのロゴはマイナ
7/98
マイナくん(仮)
https://github.com/yoku0825/MyNA/tree/master/
yet̲another̲logo
8/98
舞奈たん
マイナくん(仮)
(仮)なのは俺がこのロゴの本名を知らないから-
まいな
舞奈︖
マイナくん(仮)の擬⼈化なので緑
9/98
はい今⽇のいち
ばんおもしろい
とこ終わった
10/98
\こんばんは/
yoku0825@とある企業のDBA
オラクれない-
ポスグれない-
マイエスキューエる-
⽣息域
Twitter: @yoku0825-
Blog: ⽇々の覚書-
MyNA ML: ⽇本MySQLユーザ会-
MySQL Casualʼs Slack: MySQL Casual-
11/98
本が出ました
http://book.impress.co.jp/books/1116101077
12/98
が
13/98
目次
第 1 章 MySQL クエリーチューニングことはじめ
第 2 章 スローログの集計に便利な「pt-query-digest」
を使ってみよう
第 3 章 SQL 実⾏計画の疑問解決には「とりあえず
EXPLAIN」しよう
第 4 章 「PMP for Cacti」で MySQL のステータスを可
視化する
14/98
目次
第 5 章 MySQL のリアルタイムモニタリングに
innotop
第 6 章 再現性のあるスロークエリーには「SHOW
PROFILE」を試してみよう
第 7 章 performance̲schema を sys で使い倒す
第 8 章 MySQL のチューニングを戦う⽅へ
15/98
実はいっこもクエリチューニングしてない 
MySQL (で) 即効クエリチューニング (をしたくてしょ
うがない⼈はまずこのへんから⾒ると対象が絞り込みやすい
しチューニングのためにインデックスを作る時はこんなのモ
ニタリングしたらいいし、中⻑期的にチューニングの効果測
定するならこんなツールがいいんじゃね︖)
みたいな
正直すまんかった
16/98
この本は
200台のMySQLの⾯倒を⾒ないといけない
1台にかけられる時間は限られていて
チューニング以外にもやることはもちろんある
そんな企業のDBAに
17/98
この本は
チューニングのために pt-online-schema-change を流してみ
たけど
binlog_format= MIXED がROWフォーマットにフォールバッ
クされてレプリケーションぶっ壊れてあがががが
っていうのに気付くのが遅れたDBAとか
18/98
この本は
JOINする時に何故かインデックスが上⼿く使われなくて
どういうことだと思ってプロファイルを取ってみたら
暗黙の型変換が⾛ってスキャンジョインになっていることに
たどり着いて
ちょっと嬉しくなるDBAとか
19/98
要は4年前の俺
にオススメな
20/98
MySQLer七つ
道具のはなし
21/98
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
22/98
+ more
Perl
に限らず、ワンライナーでゴニョゴニョできる⼿になじむ⾔語-
Docker
に限らず、好きなように作って壊せる環境-
あとTwitter
「〜ってなんだったっけ︖」とつぶやくと30秒で答えが返ってくる
悪 夢のようなツール
-
23/98
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
24/98
pt-query-digest
みんなだいすきPercona Toolkitの⼈気No.1
スローログをまとめて⾒やすくしてくれる
⼤⽂字⼩⽂字、⽂字列定数と数値定数をノーマライズして「ダイジェ
スト」ごとに集約
-
25/98
先頭のセクション
$ 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
まああんま⾒ない…けど
この出⼒結果をパースして管理⽤MySQLに突っ込んでる
前⽇⽐どれくらいスローログが増えたかを確認するのに使っ
てる
SHOW GLOBAL STATUS LIKE 'Slow_queries' の増分を取るよりはもう
ちょっとグラフ化して⾯⽩い程度に取れる
-
ここで「おや︖」と思ったら深掘り(anemo eat er)開始
なので実はこれ以降あんまり⽣の pt-query-digest は⾒ない-
27/98
anemo eat erの前に、Anemometerのはなし
pt-query-digest の出⼒結果を可視化するツール
pt-query-digest の結果をMySQLに⼊れる機能(--history,
--review)をそのまま使ってる
box/Anemometer: Box SQL Slow Query Monitor
28/98
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
Anemometerの弱点
⽇次で pt-query-digest を回している程度だと、⽇単位までし
か分解できない
30/98
そこでanemo eat er
スローログをスプリットして pt-query-digest を呼びまくる
1分ぶんずつ pt-query-digest に⾷わせれば、ts_min と ts_max の差
は最⼤でも1分
-
AnemometerをDockerコンテナーとして起動する-
既存のAnemometerがあれば単にスローログを分割して⾷わせる pt-
query-digest のラッパーとして呼べる
-
31/98
with anemo eat er
最⼩1分単位でプロットできる
32/98
anemo eat er
リアルタイムでなくてもいい
スロークエリーのリアルタイム通知は別の⽅法でしてる-
グラフで⾒られれば数分前の情報であっても全然構わない-
リアルタイムを捨てて
保存期間を考えない
スローログが残っている限りの情報を、最初から、最後まで⾒られる
-
⾒るかどうかもわからないグラフのために常時リソースを割かなくて
いい
⾒たく / ⾒せたく なったら起動、⾒終わったら停⽌
-
33/98
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
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
何はなくともグラフ画⾯
36/98
“Show top queries as a separate series”
37/98
じゃん
38/98
Query̲time以外でも描画できる
39/98
⾒るところは⽣の pt-query-digest とそうそう違わない
クエリーごとにバラつきがあるか︖
バラついているなら、カーディナリティーの悪戯か、それともキャッ
シュの具合か
特にInnoDB圧縮を使ってる場合、バッファプールミスヒットやテーブルキャッシュミ
スヒットのコストは⼤きい
-
均等に遅いなら、それはクソクエリーかな-
ただし pt-query-digest がそもそも、スローログに載っているヤーツ
しか⾒られない以上、まともな速度で応答を返しているヤーツは検出
されない
-
詳細画⾯の “samples” から⽣のクエリーも⾒られる
40/98
⽣の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
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
42/98
EXPLAIN
もうみんな 目XPLAIN とかできるんでしょう︖
EXPLAIN EXTENDED
EXPLAIN format=json
の話しかしません
43/98
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
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
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
オプティマイザーを通した後の情報
想像したのと違う遅くなり⽅をしたら
<semi-join> とか <materialized> とか⾒えて楽しい
47/98
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
format=JSON
ICPな時にどこにICP当ててるのかが⾒える
くらいであんまり⾒ることはないけど
Visual Explainのタネ
正直これなら optimizer_trace ⾒た⽅が楽しい
49/98
Visual EXPLAIN
JSON⽂字列から直接これが描写できればいいのに
50/98
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
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
52/98
PMP(Percona Monitoring Plugins) for Cacti
別に for Zabbixでもいいと思う
単にウチはもともとCactiを使っていたからというだけ
既にカスタマイズしたぷらぎんもあるし
53/98
PMP for Cacti
rrdtoolだから容量効率は素晴らしい
rrdtoolだから丸め誤差は厳しい
CactiそのものがWEBからポチポチするインターフェースな
のつらい
ss̲get̲mysql̲stats.php ⾃体はPHPで、頑張って⾊々パー
スしてるので、ホゲろうと思えばホゲれる
けど、それならPerlで書きたい-
54/98
PMP for Cactiといえば
https://www.percona.com/doc/percona-monitoring-
plugins/1.1/cacti/mysql-templates.html
55/98
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
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
最近ちょっとPMM
(Percona Monitoring
and Management)試し
たい
オレオレぷらぎんがどれくらい移植し
やすいか次第
58/98
PMP for Cacti
やっぱり視認性だいじ
たまには⻑い期間で⾒る
「プラグインを⾃分で書きやすいこと」も⼤事
企業体⼒のある某社 さん是非︕-
59/98
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
60/98
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
innotop
62/98
innotop
地味に機能は多いけど今のバージョンだと表⽰されない項目
がたまにある
旧バージョンのサポート切れば楽なんだけど…と思ったり思わなかっ
たり
-
ALTER TABLE や percona-toolkit で重いことやる時のおとも
に最適
“d” で表⽰間隔の変更。0.1とかやるとたのしい-
ただし万能感を期待しない-
“Q” => “K” => “T” => “k” (killステートメント) のコンボで詰まっ
てるのを殺すくらい
-
63/98
innotop
中⾝は結構スパゲティ
最近メンテナンス遅め
ちょっと⾊々事情が-
⽇々の覚書: innotopのその後 2016年6⽉-
ちょうど先週 (JSTで1/21) 息を吹き返したところ
1.11.4 が出てる
epelへのリクエストは出した
Bug 1416245 – Package update request for innotop v1.11.4
-
64/98
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
65/98
SHOW PROFILE
MySQLの組み込みプロファイラー
「そのクエリーが実⾏されていた期間、どのStatus(SHOW
PROCESSLIST で “State” と表⽰されているもの)にどのくら
いの時間かかったか
使うのが超簡単
66/98
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
SHOW PROFILE
組み込みだから使うのは超簡単
プロファイルを「どう解析するか」はまた別の問題
ざっと⾒てわかりやすいところに時間がかかってたらつぶせ
る…くらいのノリ
再現性がないとつらい
再現性無いなら無いで、テーブルキャッシュやバッファプールのミス
ヒットに視線を移すことはできるなあ
-
68/98
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
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
70/98
performance̲schema(p̲s)
パフォーマンスモニタリング専⽤のストレージエンジン
MySQL 5.6から真っ当に使えるようになってる
吊るしのデフォルトではONになってる-
計測する項目も「だいたい必要になりそうなところ」だけがONになっ
てるので、必要になるまではそのまま使えばOK
-
メモリーを⾷うのは相変わらず
デフォルトがautosizeなので、気になる場合は固定値を決め打つ-
しかも5.7のデフォルトが auto re size になりやがった。。-
71/98
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
最近お気に⼊りの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
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
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
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
⾖知識
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
statement_analysis, innodb_lock_waits
超⾒やすい
これのためだけに p̲s と sys 有効にする価値がある
が、もうさんざん⾔ってきたので詳しくはおググりください
ちなみにこれ以外にも、GithubのREADME が⼀番出⼒例が
多くて良いと思う
78/98
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
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
MySQLer七つ道具
pt-query-digest1.
EXPLAIN2.
PMP for Cacti3.
innotop4.
SHOW PROFILE5.
performance̲schema & sys6.
???7.
81/98
Oracle MySQLでベ
ンチマークおじさん
している Dimitri を
ご存知の⽅︖
82/98
「俺が (⽇本の)
Dimitriだ」っ
て⽅︖
83/98
Dimitri KRAVTCHUK
84/98
Dimitriおじさん says
85/98
Dimitriおじさん says
86/98
Dimitriおじさん says
87/98
Thatʼs right,
WE USE OUR
BRAINs
88/98
こんなおじさんになりたい
89/98
こんなおじさんにいてほしい
90/98
みなさんのご参加をお待ちしております :)
MyNA ML: ⽇本MySQLユーザ会
MySQL Casualʼs Slack: MySQL Casual
91/98
MySQL Casual Talks vol.10
もっと深く浅く、広く狭くMySQLを使っていこうとい
う趣旨のイベントです。
多⽅⾯から多様なMySQLの使い⽅、運⽤、Tipsなどな
どのTalkを集めたいと思っております。
http://mysql-casual-slackin.herokuapp.com/ から
Slackチャンネルへjoinできますので、ご参加くださ
い。
92/98
え︖ もう補⽋
出てるって︖
93/98
やだなあ
まだ3枠余ってるじゃんすか(2017/01/25 18:00現在)
94/98
まあ冗談ではなく
95/98
既に持っている⽅、買
ってくれた⽅、よろし
ければどうぞ :)
@myfinder まで︕
96/98
旅は道連れ
世は情け
97/98
Questions
and/or
Suggestions?
98/98

Weitere ähnliche Inhalte

Was ist angesagt?

Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
Masahiko Sawada
 

Was ist angesagt? (20)

トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
 
Oracleの実行計画を読んでみよう! #dbts2017
Oracleの実行計画を読んでみよう!  #dbts2017Oracleの実行計画を読んでみよう!  #dbts2017
Oracleの実行計画を読んでみよう! #dbts2017
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
dm-writeboost-kernelvm
dm-writeboost-kernelvmdm-writeboost-kernelvm
dm-writeboost-kernelvm
 
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutesLinux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
 
What's New in MySQL 5.7 Replication
What's New in MySQL 5.7 ReplicationWhat's New in MySQL 5.7 Replication
What's New in MySQL 5.7 Replication
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 

Andere mochten auch

My sql casual talks vol.6
My sql casual talks vol.6My sql casual talks vol.6
My sql casual talks vol.6
Satoshi Suzuki
 

Andere mochten auch (12)

Best practices for MySQL High Availability Tutorial
Best practices for MySQL High Availability TutorialBest practices for MySQL High Availability Tutorial
Best practices for MySQL High Availability Tutorial
 
My sql casual talks vol.6
My sql casual talks vol.6My sql casual talks vol.6
My sql casual talks vol.6
 
SQL 脳から見た Ruby
SQL 脳から見た RubySQL 脳から見た Ruby
SQL 脳から見た Ruby
 
Chef localmodeをためした
Chef localmodeをためしたChef localmodeをためした
Chef localmodeをためした
 
MySQLアンチパターン
MySQLアンチパターンMySQLアンチパターン
MySQLアンチパターン
 
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろうMySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
 
ペパボ de MySQL
ペパボ de MySQLペパボ de MySQL
ペパボ de MySQL
 
MySQL 5.7の次のMySQLは
MySQL 5.7の次のMySQLはMySQL 5.7の次のMySQLは
MySQL 5.7の次のMySQLは
 
MySQLの限界に挑戦する
MySQLの限界に挑戦するMySQLの限界に挑戦する
MySQLの限界に挑戦する
 
MySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいことMySQL 8.0で憶えておいてほしいこと
MySQL 8.0で憶えておいてほしいこと
 
DBワークロードのAWS化とデータベースサービス関連最新情報
DBワークロードのAWS化とデータベースサービス関連最新情報DBワークロードのAWS化とデータベースサービス関連最新情報
DBワークロードのAWS化とデータベースサービス関連最新情報
 
AWS Black Belt Online Seminar 2017 Amazon Relational Database Service (Amazon...
AWS Black Belt Online Seminar 2017 Amazon Relational Database Service (Amazon...AWS Black Belt Online Seminar 2017 Amazon Relational Database Service (Amazon...
AWS Black Belt Online Seminar 2017 Amazon Relational Database Service (Amazon...
 

Ähnlich wie MySQLerの7つ道具 plus

Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
Kensuke Nagae
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
akirahiguchi
 
三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなし三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなし
Yuta Ohashi
 
Gangliaはじめました
GangliaはじめましたGangliaはじめました
Gangliaはじめました
yuzorock
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
Takeshi Arabiki
 
Iugonet 20120810 abe_analysis
Iugonet 20120810 abe_analysisIugonet 20120810 abe_analysis
Iugonet 20120810 abe_analysis
Iugo Net
 

Ähnlich wie MySQLerの7つ道具 plus (20)

MySQLerの7つ道具
MySQLerの7つ道具MySQLerの7つ道具
MySQLerの7つ道具
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
Maatkitの紹介
Maatkitの紹介Maatkitの紹介
Maatkitの紹介
 
最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-
 
負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編
 
Inside Movable Type
Inside Movable TypeInside Movable Type
Inside Movable Type
 
CPUから見たG1GC
CPUから見たG1GCCPUから見たG1GC
CPUから見たG1GC
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
 
三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなし三項演算子を見ると「ウッ」てなる人のはなし
三項演算子を見ると「ウッ」てなる人のはなし
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形
 
Gangliaはじめました
GangliaはじめましたGangliaはじめました
Gangliaはじめました
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
サーバ性能改善事例
サーバ性能改善事例サーバ性能改善事例
サーバ性能改善事例
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
Iugonet 20120810 abe_analysis
Iugonet 20120810 abe_analysisIugonet 20120810 abe_analysis
Iugonet 20120810 abe_analysis
 
What's Temporal model FuelPHP東京勉強会03
What's Temporal model FuelPHP東京勉強会03What's Temporal model FuelPHP東京勉強会03
What's Temporal model FuelPHP東京勉強会03
 
紹介 of Anemometer
紹介 of Anemometer紹介 of Anemometer
紹介 of Anemometer
 
CheckMATE introduction
CheckMATE introductionCheckMATE introduction
CheckMATE introduction
 
5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範
 

Mehr von yoku0825

MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリング
yoku0825
 

Mehr von yoku0825 (20)

逝くぞ最新版、罠の貯蔵は十分か
逝くぞ最新版、罠の貯蔵は十分か逝くぞ最新版、罠の貯蔵は十分か
逝くぞ最新版、罠の貯蔵は十分か
 
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
サーバーが完膚なきまでに死んでもMySQLのデータを失わないための表技
 
MySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれやMySQLレプリケーションあれやこれや
MySQLレプリケーションあれやこれや
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリング
 
わたしを支える技術
わたしを支える技術わたしを支える技術
わたしを支える技術
 
Dockerイメージで誰でも気軽にMroonga体験
Dockerイメージで誰でも気軽にMroonga体験Dockerイメージで誰でも気軽にMroonga体験
Dockerイメージで誰でも気軽にMroonga体験
 
MHAの次を目指す mikasafabric for MySQL
MHAの次を目指す mikasafabric for MySQLMHAの次を目指す mikasafabric for MySQL
MHAの次を目指す mikasafabric for MySQL
 
5.7の次のMySQL
5.7の次のMySQL5.7の次のMySQL
5.7の次のMySQL
 
mikasafabric for MySQL
mikasafabric for MySQLmikasafabric for MySQL
mikasafabric for MySQL
 
とあるイルカの近況報告
とあるイルカの近況報告とあるイルカの近況報告
とあるイルカの近況報告
 
MySQL Fabricでぼっこぼこにされたはなし
MySQL FabricでぼっこぼこにされたはなしMySQL Fabricでぼっこぼこにされたはなし
MySQL Fabricでぼっこぼこにされたはなし
 
MySQLと正規形のはなし
MySQLと正規形のはなしMySQLと正規形のはなし
MySQLと正規形のはなし
 
MySQLおじさんの逆襲
MySQLおじさんの逆襲MySQLおじさんの逆襲
MySQLおじさんの逆襲
 
地雷職人の朝は早い
地雷職人の朝は早い地雷職人の朝は早い
地雷職人の朝は早い
 
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーションイルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
 
MySQL5.7で遊んでみよう
MySQL5.7で遊んでみようMySQL5.7で遊んでみよう
MySQL5.7で遊んでみよう
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
光のMySQL 5.7
光のMySQL 5.7光のMySQL 5.7
光のMySQL 5.7
 

Kürzlich hochgeladen

Kürzlich hochgeladen (12)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

MySQLerの7つ道具 plus