Slide 1

Slide 1 text

MySQLストレージエンジン の仕組みをざっくり理解する revenue-hack

Slide 2

Slide 2 text

自己紹介 ● 現在フリーランス ● バックエンドとインフラをメインに活動 ● 技術顧問とかしてる ● Goがメイン(後はPHPやTSとか) ● コードのアーキテクチャ設計やAWSが好き ● フロント(React, Vue)も一応やっていた ● 最近正社員になるか悩み中。。。 ● X(@tagaranoko1014)

Slide 3

Slide 3 text

zennで書いた記事の内容を紹介 https://zenn.dev/revenuehack/articles/dc5a901fbe90e6

Slide 4

Slide 4 text

アジェンダ ● SQLの処理フローについて ● ストレージエンジンの説明 ● SELECT文実行時の場合 ● DML(INSERT, UPDATE, DELETE)実行時の場合 ● まとめ

Slide 5

Slide 5 text

1. SQLが来て、パースする

Slide 6

Slide 6 text

1. SQLが来て、パースする 2. オプティマイザが実行計画作る

Slide 7

Slide 7 text

1. SQLが来て、パースする 2. オプティマイザが実行計画作る 3. エグゼキュータが実行 4. ストレージエンジンからデータ取得

Slide 8

Slide 8 text

1. SQLが来て、パースする 2. オプティマイザが実行計画作る 3. エグゼキュータが実行 4. ストレージエンジンからデータ取得 ストレージエンジンの話!

Slide 9

Slide 9 text

ストレージエンジンのアーキテクチャ

Slide 10

Slide 10 text

Buffer pool データのキャッシュが置かれる領域。 基本的にここを通してデータが返され る。多くの場合インメモリの 80%程度 がここの領域に当てられる。 インメモリ Log Buffer ディスク上のログファイルに書き込ま れるデータを一時的に保持する領 域。redoログデータをディスクに書き 込むと、遅くなってしまうため、 Log Bufferに書き込み、速くトランザクショ ンを実行出来るようにするためにあ る。 インメモリ Redo Log INSERT時などのCOMMITタイミング でデータが書き込まれる。クラッシュ リカバリー時に対応出来るように COMMIT時にこの不揮発性ストレー ジに書き込まれる ストレージ Tablespaces テーブルやインデックスが置かれる 部分 ストレージ

Slide 11

Slide 11 text

SELECT文のフロー SELECT * FROM `users`; ※これを2回実行した場合の例

Slide 12

Slide 12 text

1回目SELECT

Slide 13

Slide 13 text

2回目目以降SELECT

Slide 14

Slide 14 text

DML文(INSERT,UPDATE,DELETE)のフロー BEGIN; INSERT INTO `users` VALUES (1, ‘hoge’); INSERT INTO `users` VALUES (2, ‘fuga’); COMMIT;

Slide 15

Slide 15 text

BEGIN; INSERT INTO `users` VALUES (1, ‘hoge’);

Slide 16

Slide 16 text

INSERT INTO `users` VALUES (2, ‘fuga’);

Slide 17

Slide 17 text

COMMIT;

Slide 18

Slide 18 text

チェックポイントのタイミングwrite! Tablespacesへはいつ書き込まれる?

Slide 19

Slide 19 text

チェックポイントっていつ? ● ReadLogのサイズがあふれる時 ● あまりMySQLが稼働してない時(CPU使用率が低い) ● 適当な時間間隔 ● …

Slide 20

Slide 20 text

まとめ ● バッファプールキャッシュのサイズは重要 ● ストレージエンジンの仕組みを理解しておくと、パフォーマン スチューニングに役に立つ