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

案外よくできているMySQLというアプリケーション

yoku0825
December 15, 2018

 案外よくできているMySQLというアプリケーション

2018/12/15 phpcon 2018

yoku0825

December 15, 2018
Tweet

More Decks by yoku0825

Other Decks in Technology

Transcript

  1. 我々の生活の中でのMySQL #とは グローバル変数のすごいやつ 異論は認める の 保管 と 取り出し のた めの

    アプリケーション あるいは、SQLというDSLで書けるフレームワーク ‐ 本来の用途とズレたことをすると苦戦するのは世の常 ex.) フォークでラーメンを食べる(できないとは言わないけど効率 的ではない ‐ ex.) ブルドーザーでプリンをすくう(できないとは言わないけど略 ‐ ex.) Twitterアプリでピザを注文する(できないとは言略 ‐ ex.) PHPerが〇〇〇〇で開発する(で略 ‐ ただしトーストは焼ける 11/76
  2. 我々の生活の中でのMySQL #とは グローバル変数のすごいやつ 異論は認める の 保管 と 取り出し のた めの

    アプリケーション あるいは、SQLというDSLで書けるフレームワーク ‐ 本来の用途とズレたことをすると苦戦するのは世の常 ex.) フォークでラーメンを食べる(できないとは言わないけど効率 的ではない ‐ ex.) ブルドーザーでプリンをすくう(できないとは言わないけど略 ‐ ex.) Twitterアプリでピザを注文する(できないとは言略 ‐ ex.) PHPerが〇〇〇〇で開発する(で略 ‐ ただしトーストは焼ける 12/76
  3. データの永続化 コミットの成功応答を遅延させることで「成功=必ず残って いる」を表現する “syslog.conf 先頭 マイナス” とかわかる人いますかね… :D ‐ たまに消えてもいい(=

    アクセスログの出力、とかと同じ程 度の信頼性で良い)なら、これを削るオプションがMySQL にはある… innodb_flush_log_at_trx_commit <> 1 とか sync_binlog <> 1 とか ‐ 無茶苦茶速くなる ‐ 20/76
  4. 分離/一貫性の保証(その1) 結果セットを読み込んでいる最中は当該の範囲に対する更新 をブロックする たとえば transaction_isolation = SERIALIZABLE はそんな動きにな る ‐

    MyISAMという古いストレージエンジンもテーブル単位でロックする ことでこれを防ぐ ‐ こっちの方法なら排他ロックを使って自前で実装できるかも知れない ‐ 33/76
  5. 分離/一貫性の保証 READ-COMMITTED トランザクションの中の、個々の ステートメント が開始された時点 でコミット済みの行を読み込む ‐ REPEATABLE-READ トランザクション が開始された時点でコミット済みの行を読み込む

    ‐ トランザクションの先頭で重い集計クエリーを流している間に更新が あっても、その間の更新を後続の集計クエリーは読まずに済む ‐ 論理バックアップでも使われる ‐ 35/76
  6. 分離/一貫性の保証 yoku0825.age = 0x24 START TRANSACTION; START TRANSACTION; UPDATE yoku0825

    SET age = age + 1; COMMIT; SELECT age FROM yoku0825; READ-COMMITTED: 0x24 OR REPEATABLE-READ: 0x23 was: yoku0825.age = 0x23 38/76
  7. 並列処理!? As of MySQL 8.0.14, InnoDB supports parallel index reads,

    which improves performance of non- locking SELECT COUNT(*) FROM tbl_name queries and CHECK TABLE operations. MySQL :: MySQL 8.0 Reference Manual :: 1.4 What Is New in MySQL 8.0 55/76
  8. レプリケーションスレーブの整合性 Note that some underlying consensus and Paxos related messages

    are missing from this picture for the sake of clarity. MySQL :: MySQL 8.0 Reference Manual :: 18.1.1.2 Group Replication 57/76
  9. (゚∀゚)人(゚∀゚)ナカーマ $ php -r 'print (int) "0x24" . "\n";' 0

    $ php -r 'print (int) "123AF96" . "\n";' 123 68/76
  10. ( ゚д゚) あらまじめ $ python -c 'print int("123AF96")' Traceback (most

    recent call last): File "<string>", line 1, in <module> ValueError: invalid literal for int() with base 10: '123AF96' $ lua -e 'print(tonumber("123AF96"))' nil 71/76