色々調べたことを雑多に書き殴る
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に保存