Upgrade to Pro — share decks privately, control downloads, hide ads and more …

とあるイルカのデータベース

 とあるイルカのデータベース

2018/07/06 GMOテクノロジーブートキャンプ

yoku0825

July 06, 2018
Tweet

More Decks by yoku0825

Other Decks in Technology

Transcript

  1. MySQL #とは グローバル変数のすごいやつ 異論は認める の 保管 と 取り出し に 特化

    した アプリケーション 特化している以上、それ以外のことは(できなくはなかった としても)性能が落ちる ただしトーストは焼ける 15/119
  2. \こんにちわ/ yoku0825@GMOメディア株式会社 オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter:

    @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会副代表 ←new!! ‐ MySQL Casual ‐ 18/119
  3. トランザクションの分離/一貫性の保証 auto row= get_row(); switch (isolation_level) { case READ-COMMITTED: while

    (row) { if (row.has_committed) return row; else row->prev_version(); } case REPEATABLE-READ: while (row) { if (row.has_committed && row.commit_time < transaction_started) return row; else row->prev_version(); } ...; } 36/119
  4. InnoDBの書き込み trx InnoDBログ バッファプール UNDOログ テーブルスペース ファイル SQL開始 まだ Synced

    Copying Synced SQL実行 まだ Updating Copied Synced COMMIT待ち Writing/ Syncing Updated Copied Synced COMMIT完了 Synced Synced Copied Outdated (非同期) Synced Synced Copied/ Purged Synced 60/119
  5. InnoDBの書き込み trx InnoDBログ バッファプール UNDOログ テーブルスペース ファイル SQL開始 まだ Synced

    Copying Synced この時点で他のトランザクションがSELECTした場合、バッ ファプールの情報を読むため問題ない この時点で他のトランザクションが書き込もうとした場合は ロック待ちになる この時点でクラッシュした場合、中途半端なUNDOログを捨 てればステートメントはなかったことにできるので問題ない 61/119
  6. InnoDBの書き込み trx InnoDBログ バッファプール UNDOログ テーブルスペース ファイル SQL実行 まだ Updating

    Copied Synced この時から他のトランザクションはバッファプールの更新後 のページに書かれた ロールバックポインター を読んで、 UNDOログから前のバージョンを取り出すようになる この時点でクラッシュした場合、UNDOログの消し込みだけ でいい(バッファプールはオンメモリーなのでクラッシュし たら消える) 62/119
  7. InnoDBの書き込み trx InnoDBログ バッファプール UNDOログ テーブルスペース ファイル COMMIT待ち Writing/ Syncing

    Updated Copied Synced 他のトランザクションからのSELECTは同じ クラッシュも書きかけのInnoDBログを捨てれば操作前の状 態に戻れる 63/119
  8. InnoDBの書き込み trx InnoDBログ バッファプール UNDOログ テーブルスペース ファイル COMMIT完了 Synced Synced

    Copied Outdated ここでコミットが終了するので、他のトランザクションは更 新された新しいバッファプールのデータを読む(またはトラ ンザクション分離レベルに応じてUNDOを読む) コミットされた時点でロックが外れるので、他の書き込みト ランザクションも動き始められる バッファプールとInnoDBログさえ排他にロックできればいいので、 テーブルスペースファイルが同期されるのを待つ必要はない ‐ ここでクラッシュした場合、更新前のテーブルスペースファ イルの値と、更新差分であるInnoDBログを使って、クラッ シュ前にバッファプールに載っていたページを再計算する 64/119
  9. InnoDBの書き込み trx InnoDBログ バッファプール UNDOログ テーブルスペース ファイル (非同期) Synced Synced

    Copied/ Purged Synced コミット完了以後、他のトランザクションからの参照, 書き 込みと永続性に関しては変化はない クラッシュリカバリーの時間を短縮するため、バッファプー ルの値をテーブルスペースファイルにフラッシュして、再計 算が必要なページの数を減らす 65/119
  10. InnoDBの書き込み trx InnoDBログ バッファプール UNDOログ テーブルスペース ファイル SQL開始 まだ Synced

    Copying Synced SQL実行 まだ Updating Copied Synced COMMIT待ち Writing/ Syncing Updated Copied Synced COMMIT完了 Synced Updated Copied Outdated (非同期) Synced Synced Copied/ Purged Synced 67/119
  11. MyISAMのインデックス方式 INSERT INTO t1 VALUES (2, 'two', 'ni'); |1|:|o|n|e|:|i|c|h|i|2|:|t|w|o| |:|n|i|

    PRIMARY 1 => offset 1 2 => offset 11 SECONDARY one => offset 1 two => offset 11 70/119
  12. MyISAMのインデックス方式 INSERT INTO t1 VALUES (3, 'three', 'san'); |1|:|o|n|e|:|i|c|h|i|2|:|t|w|o| |:|n|i|3|:|t|h|r|e|e|:|s|a|n|

    PRIMARY 1 => offset 1 2 => offset 11 3 => offset 19 SECONDARY one => offset 1 three => offset 19 two => offset 11 71/119
  13. MyISAMのインデックス方式 UPDATE t1 SET val = 'nii' WHERE num =

    2; |1|:|o|n|e|:|i|c|h|i| | | | | | | | | |3|:|t|h|r|e|e|:|s|a|n|2| |:|t|w|o|:|n|i|i| PRIMARY 1 => offset 1 ---- 2 => offset 30 3 => offset 19 SECONDARY one => offset 1 three => offset 19 ---- two => offset 30 72/119
  14. InnoDBのクラスターインデックス INSERT INTO t1 VALUES (3, 'three', 'san'); |1|:|o|n|e|:|i|c|h|i|2|:|t|w|o| |:|n|i|3|:|t|h|r|e|e|:|s|a|n|

    PRIMARY 1 => offset 1 2 => offset 11 3 => offset 19 SECONDARY one => 1 three => 3 two => 2 76/119
  15. InnoDBのクラスターインデックス UPDATE t1 SET val = 'nii' WHERE num =

    2; |1|:|o|n|e|:|i|c|h|i| | | | | | | | | |3|:|t|h|r|e|e|:|s|a|n|2| |:|t|w|o|:|n|i|i| PRIMARY 1 => offset 1 ---- 2 => offset 30 3 => offset 19 SECONDARY one => 1 three => 3 two => 2 77/119
  16. クエリーリライト mysqlコマンドラインクライアントを起動してるのに、うっ かりlsとか叩いちゃったことありませんか? mysql57> ls; +--------------+ | Tables_in_d1 | +--------------+

    | t1 | +--------------+ 1 row in set, 1 warning (0.01 sec) mysql57> SHOW WARNINGS; +-------+------+-------------------------------------------------------------------+ | Level | Code | Message | +-------+------+-------------------------------------------------------------------+ | Note | 1105 | Query 'ls' rewritten to 'SHOW TABLES' by plugin: rewrite_example. | +-------+------+-------------------------------------------------------------------+ 1 row in set (0.00 sec) 89/119
  17. クエリーリライト catとかお好きですか? mysql57> cat t1; +-----+-------+ | num | val

    | +-----+-------+ | 1 | one | | 2 | two | | 3 | three | +-----+-------+ 3 rows in set, 1 warning (0.02 sec) 90/119
  18. マイエスキューエル The official way to pronounce “MySQL” is “My Ess

    Que Ell” (not “my sequel”), but we do not mind if you pronounce it as “my sequel” or in some other localized way. http://dev.mysql.com/doc/refman/5.7/en/what-is- mysql.html 102/119
  19. Myちゃん MySQL is named after co-founder Monty Widenius’s daughter, My.

    http://dev.mysql.com/doc/refman/5.7/en/history.html ただしMyちゃんの名前の発音は ミィ 104/119
  20. Mariaちゃん MariaDB continues this tradition by being named after his

    younger daughter, Maria. https://mariadb.com/kb/en/mariadb/why-is-the- project-called-mariadb/ 106/119
  21. サキラまたはサキーラ The name of the MySQL Dolphin (our logo) is

    “Sakila,” http://dev.mysql.com/doc/refman/5.7/en/history.html 110/119