コピペコードで快適生活

明日使えるソースを自分のために

MySQL予習メモ (2020年12月版)

MySQLとしばらく密にお付き合いすることになりそうなので、色々と予習したことメモ。

InnoDBのバッファプール

  • 取得処理では、バッファプールにデータがあればそれ返す。なければ、テーブルスペースから取得してプールして、それを返す。
  • 更新系では、プールにデータを書き込む→ログに書き込む→非同期でログファイルの内容がテーブルスペースに書き込まれる。
  • テーブルスペースに反映前のログファイルがあるときに、該当データを取得しようとすると、最初にテーブルスペースに書き込まれる。(SELECTだけなのに書き込みが発生する)
  • バッファプールにはページ単位で書き込みがされる。
  • 物理メモリの75%とかよく言われるらしい。
  • ページとは、InnoDBでバッファプールに読み書きする最小単位。1行以上のデータが入る。
  • InnoDBでは行の最大サイズはページサイズの半分以下に制限される。
  • リンク

MyISAM

  • メモリに書き込みして、ディスクへのフラッシュをOS任せにしている。なのでクラッシュしたらフラッシュ前のデータは揮発してしまう。
  • トランザクションがなくその分のオーバーヘッドが発生しないため、高速に動作する。
  • テーブル単位でロックするため、並行書き込みに優れない。

レプリケーション

  • マスターで発行された更新処理を同じ順番でスレーブで実行することで、データの複製を行なっている。
  • 実質非同期でデータは複製されている。
  • マスターからスレーブに送られるのはバイナリーログ
  • バイナリーログの形式
    • SBR: SQLステートメント単位(1SQL 文) 単純なSQL。マスターにあってスレーブにないデータがあっても空振りするだけでエラー出ない。
    • RBR: 行単位。更新前と更新後のデータが含まれる。マスターにあってスレーブにないデータがあるとエラーする。5.1から導入。5.7からデフォルト。
  • pt-checksum / pt-table-sync
    • マスタースレーブのデータのズレを検出、修正する。SBRとRBRそれぞれで生成されたチェックサムを比較することでズレを検出する。SBRはスレーブで、RBRはマスターでチェックサムが生成される。
  • リンク

バックアップ

こんなのあったんだ

パフォーマンスチューニング

  • Optimizerは、実行計画の決定をする。
  • Executer
    • 実行計画の通りにHandlerを叩く
    • Handlerからの結果をもとに残処理を行う。
    • この残処理をさせてしまうのが重たいので、なるべくExecuterに処理をさせないようにする。
    • キーワード
      • Using where Executerがフィルターしてる
      • Using filesort Executerがソートしている
  • Handlerは、DBエンジンの抽象化レイヤー
  • インデックス
    • 検索時はひとつのテーブルにつき一つのインデックスしか使えない。
    • USE INDEXで使用するインデックスを指定できる。
    • MySQLはB+木でインデックス作っている。
  • 設定値
    • innodb_buffer_pool_size
    • innodb_log_buffer_size テーブルスペースに書き込まれるまで、ログファイルはここにいる。
  • リンク

ネクスキーロックとは

Percona

  • Percona
  • MySQLのプロ集団企業
  • ツールも色々出してる

SHOWステートメントいろいろ

SHOW GLOBAL STATUS
SHOW INNODB STATUS
SHOW MASTER STATUS
SHOW SLAVE STATUS