色々調べたことを雑多に書き殴る

MySQL 5.7 / 8.0 違い

https://dev.mysql.com/doc/refman/8.0/ja/upgrading-from-previous-series.html

  • セキュリティの更新

    • mysql_native_password の代わりに caching_sha2_password および sha256_password 認証プラグイン
    • default_authentication_plugin のデフォルト値が変更に
  • デフォルトの文字セットが latin1 から utf8mb4 に

個別に見て行っても厳しいので人のブログ読んだ方が良さそう https://blog.cybozu.io/entry/2021/05/24/175000

  • 一般的にデータベースのアップグレードは事前の検証やコードの修正に大きな労力が必要であり、敬遠されることも多い作業
  • GTID(グローバルトランザクション識別子)によるレプリケーションは、temporary table の操作や一部ステートメント利用負荷
  • AUTO_INCREMENT バグの修正

https://qiita.com/yassun-youtube/items/9651710ec602225955af MySQLではDBに文字を保存するとき、Charset (文字コード) を指定 Charsetのデフォルトは、5.7まではlatin1、8.0からはutf8mb4

  • latin1 : 日本語対応してない
    • ISO 8859-1(より正式にはISO/IEC 8859-1)はISO/IEC 8859の第一部であり、ラテンアルファベットの文字コード標準
    • よりくだけた言い方ではLatin-1
    • ISO 8859-1が符号化しているものは「ラテン文字第1部」と呼ばれ、ラテン用字系の191文字

https://speakerdeck.com/hmatsu47/mysql-8-dot-0hefalseyi-xing-wokao-eru?slide=3

  • MySQL 8.0 になると、Winwow 関数、CTE CHeck 制約など SQL 増える
  • MySQL Shell の管理強化
  • クエリキャッシュ廃止
  • デカ目のサーバーに合わせた設計に変化

JDBC

MySQL では、JDBC、ODBC、および .Net の標準ベースドライバを提供 https://www.mysql.com/jp/products/connector/

ぱっと見いろんな言語向けのドライバあり

JDBCドライバとは、異なるデータベースに対するアクセスを行う際に、個々のデータベース毎にプログラムを書き換えなくていいように、データベースとJavaプログラムの間にあってデータベース毎の差を吸収してくれるもの

Java - JDBC – MySQL / SQL Server / …

JDBCはプラグイン、通信エージェント、SDK 的な見方もできる

https://dev.classmethod.jp/articles/faster-failover-by-aurora-jdbc-driver/ これはドライバが、接続しっぱなしでDB innodb_read_only で判断する例。 DNSのTTLより高速

AWS JDBC for MySQL https://github.com/awslabs/aws-mysql-jdbc#amazon-web-services-aws-jdbc-driver-for-mysql

Aurora MySQL / DynamoDB (NoSQL) の比較検討

https://logmi.jp/tech/articles/320552

  • NoSQL は RDBMS のサブセット→つまり何かの機能を抜いている→それにより優位を得ている

これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~ https://connpass.com/event/91736/presentation/

  • 垂直分散:テーブルごとにDBを分ける
  • 水平分散:同じテーブルをIDのまとまりごとにDBを分ける  インデックスがメモリに乗らないときとか

水平分割で判断が必要な点

  • キー  → ユーザーID
  • 分割数 → 20

水平分割する場合は、各シャードのキーを設定し、アプリ側でシャードキーで分割する

Shading https://qiita.com/hharu/items/15627d2058bffe1fadf0 書き込みが多い時に使う Read Replica とかで分散できないため

NoSQLであるDynamoDB

https://aws.amazon.com/jp/blogs/news/amazon-dynamodb-gaming-use-cases-and-design-patterns/

  • 1 桁ミリ秒で測定される一貫した低レイテンシー
  • スケール

グローバルテーブル:マルチリージョン

パーティションキー:プライマリキー?

  • 1:1 モデリング : プライマリキー = パーティションキーあたりデータが1つ

  • 1:M : パーティションキーあたりデータが複数:パーティションキー + ソートキーで uniqueなプライマリキー

  • M:M : テーブルとグローバルセカンダリインデックスがあるため、パーティションキーに相当するものがたくさん?

  • ゲームステート、プレイヤーのデータストア / プレイヤーのセッション履歴のデータストア 1:! / 1:M

  • リーダーボード M:M

高い同時実行性は 1 秒あたり 100,000 件以上のリクエストと、1 日あたり数百万人のアクティブユーザー MySQL→DynamoDB

フルマネージドなので管理コスト少ない 1:1であれば圧縮も有効か? gzip圧縮してbase64 にして dynamoDBに保存

MySQL Connection Pooling

Aurora MySQL / DynamoDB (NoSQL) の比較検討