Closed4
Aurora3系アプデでなにが変わったか記事のログ
これはなに
記事を書くログ。思考ダダ漏れ
何を書くか?
- これ網羅する系の記事だから、単純にどういう種別なのかを整理して、章立てして書き出す感じになりそう
- 参考にする記事は、
- All about社の記事
- MySQL8.0の変更点, MySQL公式
- サイボウズのMySQL8.0移行記録
- SmartBankのAurora MySQL8.0移行記録
- AWS Aurora MySQLのバージョン情報 - AWS公式
- https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.VersionPolicy.html#Aurora.VersionPolicy.MajorVersions
- これ、Aurora3入れましたって言ったらどのマイナーバージョンが入るの?
- Aurora MySQL バージョン 2 と Aurora MySQL バージョン 3 の比較
- MySQL8.0コミュニティエディションからの機能
- https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.MySQL80.html#AuroraMySQL.8.0-features-community
- 「Aurora MySQL バージョン 3 の初期リリースは、MySQL 8.0.23 コミュニティエディションと互換性があります。」これ、バージョン情報のところに書いてあることと矛盾しない? マイナーバージョンによっては違うよね?
- いやそんなことなかった、Aurora3.01でもMySQL8.0.23は確実
- 現実的にはAurora MySQL 3.04がLTSかつ期限が遠いのでこれをみんな使ってる?
- えーつまり、そもそもみんながAurora3にアプデするぞって言った時に入れているマイナーバージョンはなんなの? って話があるな?
- たぶん、アップデートするときにマイナーバージョンを指定しないといけなくて、LTSが3.04なのでみんなそれ入れてるのかなと思う
- あとは記事一つずつ読んで、まとめていくか。
記事を読んでいく
All about社の記事
- リンク
- 変更点まとめというよりはどんな手順でアップデートに対応したか? のログだな
- 直面した不具合のログがよい
- NO_AUTO_CREATE_USERというSQLモードが使えなくなっており、そこにLaravel5.5が追従できてなかったためLaravelのパッチも当てなきゃいけなくなってる
- これ古いLaravelだと一手間あってめんどいね
- けど5.5使ってるところは他のつらみもたまってそうで大変そう
- データソート時のメモリー不足
- これ、たぶん以前のおれならピンときてない
- なんかメモリが足りなくなることについてあまり実感がなかったんだよな
- けどインデックスだとかサブクエリだとかいろんなところでメモリが使われて、わりとこうメモリ使いすぎるなよと注意書きされているのを繰り返し見て、まずいんだなとわかってきた。
- あとソートはDBが苦手な分野だし
- データとってきてからメモリ上でソートとある
- けど、これまでもメモリのデータ見てそれをソートしてからみたいなことしてたのでは?
- 参考1
- https://dev.mysql.com/doc/refman/8.0/ja/order-by-optimization.html
- そうそうインデックスとかのね話ね
- あとで読もう
- 参考2
- クラスタインデックスでソートが発生しないようにして対応とある
- クラスタってあれだっけポインタだけではなくデータも持ってるやつだっけ
- データページの並びとインデックスの並びがおなじやつ
- まとめてとるときとかに便利? 何が嬉しいんだろう
- までもソートしなくてよいというのは分かる、最初からその順番でデータがある訳だから
- これ、たぶん以前のおれならピンときてない
- NO_AUTO_CREATE_USERというSQLモードが使えなくなっており、そこにLaravel5.5が追従できてなかったためLaravelのパッチも当てなきゃいけなくなってる
- あと移行するときに引き継がれない設定とかについても書いてある
- たしかにそれも気にしなきゃだなあ
- 感想
- いい記事だった
MySQL8.0のソートの話
- リンク
- 基本的には技評の記事と同じ
- ソートでインデックスが使われるための条件とか
- selectで使われる値も選択しないとソートされないよ
- ここ普通にやりそう。orderbyのときは*禁止にしたいところだね
MySQL8.0のソートの話, ぎひょうの解説
- リンク
- orderbyは高コストだからインデックス貼るといいよ
- explainしてUsing filesortとなってなければインデックスを使えている。なってたら、頑張ってソートしてる
- その頑張ったソートのやりかたを今回説明。
- MySQL5.6からふたつのやり方にふえたらしい。ほーん。最適化の仕方は8.0からとか関係なくて、あーそうかソートされるタイミングが変わったんだよな。メモリがどうとかの。。
- 5.5以前の手法
- ソートしたい値とrow idのペアをメモリにばーっと積み込んで並び替える
- メモリに乗らなかったらテンポラリのファイルをつくる。んでマージソートする
- マージソートとは
- なるほどマージソートの最後の結合のところやんのね
- ふたつの配列の最小を比較して、小さいやつ順に新しい配列を作って行く
- おけおけ
- 5.6以降の手法
- ソートに使う項目ではなく、SELECTで指定したカラムたちとソート用項目でソートする
- row idを使ってデータを取ってくる手間がいらないので、行読み取りが一回で済む
- ただしSELECTしてる項目が多いとメモリにたくさん乗せることになるので注意が必要
- どちらの手法が選ばれるか?
-
max_length_for_sort_data
システム変数 - ここの値を小さくすると、5.5方式になる。どこまでメモリに載せるのかの閾値になっている
- じゃあバッファーサイズ変えるよりはこの値変える方がいいような気はするなあ
- てかこう、一定の目安が割合としてありそう。バッファーサイズの何分の一をここで指定する、みたいな目安がありそう
- MySQL8.0.20で廃止!!! なんやねん
- 常に新しい方式が採用されているっぽい
- なるほどこれが今回からの変更ってことか
-
- 5.6以降では、インデックスの効かないソートでもリミットがあるとソートされることがある
- LIMIT指定されたカラムタプルがソートバッファにおさまるかを実行前に計算する
- 収まるならソートバッファを優先して使い、メモリ上で完結する
- LIMIT指定してもソート前のやつは全件扱うのでは? それは乗らないことない?
- 最適化されたかはoptimizer_traceのfile_summaryでわかるらしい
- とは
- ああそういうinfomation schemaがあるのか
- まとめ
- とはいえインデックスでやんのが速い
- 次点でここのやつ
where句狙いのキー、order by句狙いのキー
- リンク
- yoku0825さんの記事。今さらだけど読むか。
- 思ったよりかなり量あるな
- まあようするにインデックスはれということ
サイボウズのMySQL8.0移行記録
- https://blog.cybozu.io/entry/2021/05/24/175000
- MySQL8.0.20までのリリースノートを見てやってるらしい
- たぶん Aurora3系で今使われるのはAurora3.04であり、MySQL8.0.28相当なので、そこまで見た方がいい気がするな
- 変更点
- 文字コードとして utf8mb4 を使っている場合の照合順序のデフォルト値が utf8mb4_general_ci から utf8mb4_0900_ai_ci に変更されました。
- 順序の評価をするときに並びが変わっちゃう
- 詳しいのはこの記事
-
SQL_CALC_FOUND_ROWS と FOUND_ROWS() が deprecated に
- フーン
- これLaravelで使ってたりする?
- 使ってなさそう。みんな生で書いてる。じゃあコード検索して使ってないか確認すればいいね
- 参考
- 重たくなるかもしれんなあ
-
Connector/J のメタデータ取得処理の性能低下
-
Connector/J とは
- JavaのMySQLドライバ
- 8.0.21からは性能がマシになってるらしく、今回は関係なさそう
-
Connector/J とは
- ロック競合の状態を解析に利用するsys.innodb_lock_waitsに関する不具合
- 1秒間隔でモニタリング用SQL流してると重たいらしい
- これAuroraでそういう監視したい時どうしてるんだろう。全く違う方法でやってたりする?
- https://dev.classmethod.jp/articles/amazon-aurora-monitoring/
- こういうのあるけど、sys.innodb_lock_waitsのが詳しい内容ではあるな
- これAuroraでそういう監視したい時どうしてるんだろう。全く違う方法でやってたりする?
- 8.0.23を使った説明で特に不具合なく使ってそうな記事があるので現在はうまくいくのかもしれない。未検証
- バグ報告のスレッドはこちら
- https://bugs.mysql.com/bug.php?id=100537
- あんま議論進んでないから対応されてないかもなあ
- 1秒間隔でモニタリング用SQL流してると重たいらしい
-
外部キー制約をもつテーブルの DDL 操作によるメタデータロックの発生
- あこれyoku0825さんが言ってたやつか
- 外部キー貼ってるテーブルに対してalterするとロックとるんだよな
- alterがブロックされるならいいけど、alterが先に占有しちゃってユーザー影響あると怖い
- yokuさんの記事読む感じなさそうだな
- 実行したクエリがどんなロックを取っているのか確認する方法ってあんのかな?
- ああなるほど、トランザクション内でperformance schema見ればいいのか
-
トランザクション分離レベルを設定する変数名の変更
- 接続時にトランザクション分離レベルを指定しているケースでなんか困ったとのこと
- 普段トランザクション分離レベルの指定とかしないけど、どういう動機でするんだろう
- ゲームとかだとやんのかな、なんかユーザー数多いとか厳密なトランザクション管理が求められるやつあるよね
-
UNION 句と FOR UPDATE を使う場合に括弧が追加で必要
- ほーん
- SQLの書き方
-
Implicit Account Creation の廃止
- はい
- Grantでユーザが作られるやつらし
-
information_schema のカラム名が大文字固定に
- そんなんあったんか。これまではどっちでも良かったらしい
-
EXPLAIN ステートメントの EXTENDED キーワードの廃止
- デフォルトになったらしい。ありがたい
-
GROUP BY a ASC の廃止
- へーそんな仕様が
- これからはGROUP BYとORDER BYは分けて書く
- 文字コードとして utf8mb4 を使っている場合の照合順序のデフォルト値が utf8mb4_general_ci から utf8mb4_0900_ai_ci に変更されました。
- 感想
- 詳しい! えらい!
SmartBankのAurora MySQL8.0移行記録
- リンク
- Auroraの記事だ
- 三つの問題
- collation
- 文字コードの順序のやつ
- 暗黙の昇順ソート
- GROUP BYでソートさせるやつ
- クエリによるCPU負荷
- SELECT COUNT(*)で重くなるらしい
- 件数出す定数みたいなやつが廃止になった後にこれはきついね
- これどういう仕組みで重くなってる? ちょっと背景がわからんな
- この記事に詳しいかも。ただいくつか前提としてわからんところがあるから、あとで別途読み込もう
- collation
-
tmp table 溢れ
- このバグらしい
- tempテーブルをgroup byで使うとエラーになる
- ただ8.0.27で治ったらしい。OK
- 良かった点
- セミジョインで高速化したクエリがあったはず
- ほー
- AUTO_INCREMENT周りの悩みが減った!
- 良かったね
- window関数が使えて感動!!!
- せやな
- migrationがちょっと安全になった!
- 既存テーブルへのデフォルト値つきカラム追加が安全になった
- 5.7以前ではテーブル全体が書き換わるため書き込みがブロックされてた
- 共通テーブル式(CTE)が使えるぅ〜
- https://gihyo.jp/article/2022/10/mysql-rcn0181
- 便利。モジュール化できる感じだな
- セミジョインで高速化したクエリがあったはず
- 感想
- count(*)とか知らんかったなあ
- これyokuさんのブログざっと読んだ方がいいかもしれんね
- count(*)周りの議論
- 参考になりそうな記事
- まず解っとらん単語
-
-
- 「テーブルの実体は、PKによるBツリーのクラスタインデックスである」
- 公式にそんな感じのことが書いてある
-
- 結構深い話になりそうなので一旦やめよう。とにかく遅くなるしみんな困っているっぽい。じゃあどうすんねんカウント。。
- 8.0.28でも遅いって言ってるしなあ
MySQL8.0の変更点 - MySQL公式
- https://dev.mysql.com/doc/refman/8.0/ja/upgrading-from-previous-series.html
- 主なやつ? サイボウズはマイナーバージョンアップのリリースノート見て確認してたけど。
- MySQL8.0での新機能
- https://dev.mysql.com/doc/refman/8.0/ja/mysql-nutshell.html#mysql-nutshell-removals
- これと変更点ページはどう違うの。。ただ8.0.23くらいまでが多分載っている
- リリースノート
- 8.0.21
- 8.0.22
- 8.0.23
- 8.0.24
- 8.0.25
- 8.0.26
- 8.0.27
- 8.0.28
- 感想
- まあ、膨大すぎて追いかけられないな
Aurora MySQL バージョン 2 と Aurora MySQL バージョン 3 の比較 - AWS公式
MySQL8.0コミュニティエディションからの機能 - AWS公式
- https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.MySQL80.html#AuroraMySQL.8.0-features-community
- JSON 関数。使用に関する情報については、MySQL リファレンスマニュアル のJSON 関数を参照してください。
- ウィンドウ関数。使用に関する情報については、MySQL リファレンスマニュアル のWindow 関数を参照してください。
-
WITH
句を使用した共通テーブル表現 (CTE)。使用に関する情報については、MySQL リファレンスマニュアルの WITH (共通テーブル表現)を参照してください。 -
ALTER TABLE
ステートメントの、最適化されたADD COLUMN
とRENAME COLUMN
句 。これらの最適化は「インスタント DDL」と呼ばれます。Aurora MySQL バージョン 3 はコミュニティ MySQL インスタント DDL 特徴と互換性があります。旧 Aurora 高速 DDL特徴は使用されていません。インスタント DDL の使用情報については、インスタント DDL (Aurora MySQL バージョン 3) を参照してください。 - 降順、機能、不可視インデックス。使用に関する情報については、MySQL リファレンスマニュアルの非表示インデックス、降順インデックス、およびCREATE INDEX インデックスを参照してください。
- SQL 文で制御されるロールベースの権限。権限モデルの変更については、ロールベースの特権モデル を参照してください。
-
SELECT ... FOR SHARE
文のNOWAIT
とSKIP LOCKED
句。これらの句は、他のトランザクションが行ロックを解放するのを待つことを避けます。使用の詳細については、MySQL リファレンスマニュアルの読み取りロックを参照してください。
分類
気持ち
- 膨大だ
- これを分類するのは結構大変
- あり得そうなものとしては、
- 追加機能、改善(使いこなしていい気持ちになるもの)
- CTEとかWindow関数とか関数インデックスとかJSON関数とか
- AUTO_INCREMENT
- 不具合やパフォーマンス問題を引き起こすもの(回避したいもの)
- collation問題
- count(*)でメモリに乗らなくなると重いまま(本来は古いのが弾かれるはずだがそうならない)
- 外部キーを設定したテーブルの親にALTERするとロックされてしまう
- データソート時のメモリー不足
- 使えなくなったもの
- GROUP BY a ASCみたいなやつ
- SQL_CALC_FOUND_ROWS と FOUND_ROWS() が deprecated に
- NO_AUTO_CREATE_USERというSQLモード
- 追加機能、改善(使いこなしていい気持ちになるもの)
COUNT(*)問題は別途読む!
このスクラップは2024/03/24にクローズされました