Aurora MySQL 3.08.0(MySQL 8.0.39互換)がリリース!低速なSELECT COUNTは改善されたのか!?

メディア統括本部 サービスリライアビリティグループ(SRG)の鬼海雄太(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、AWSのAurora MySQLの3.08.0(MySQL8.0.39互換)がリリースされたことをうけ、過去のSELECT COUNTが遅い問題が解決しているかを検証した記事になります。
なにかの役に立てば幸いです。
 

Aurora MySQL 3.08.0(MySQL8.0.39互換)リリース!


2024年11月18日(日本時間で19日)にAurora MySQL 3.08.0(MySQL 8.0.39互換)がリリースされました! 公式のWhats newのリリース記事とその内容を一部引用します。
MySQL 8.0.39にはいくつかのセキュリティ強化およびバグ修正に加え、 多数のテーブルを扱う際のデータベースの可用性を向上させ、 redoログおよびインデックス処理に関連するInnoDBの問題を軽減する強化が含まれています。 Aurora MySQL 3.08には、データベースの再起動を減らすための複数の可用性向上、 新しいCloudWatchメトリクスを用いたメモリ管理のテレメトリの改善、 Aurora MySQL 2から3へのメジャーバージョンアップグレードの最適化、 およびメモリ管理と可観測性に関する一般的な改善も含まれています。

気になったアップデート項目抜粋


次にリリースノートを確認していきましょう。
 
可用性の向上や改善の他に、多くのメトリクスが追加されているようです。

CloudWatchメトリクス関連

ユーザーが InnoDB パージ プロセスを監視できるように、3 つの新しい Amazon CloudWatch メトリクスが追加されました。
パージ境界を妨げている可能性のある長時間実行トランザクションをユーザーが識別できるように、新しい CloudWatch メトリクスを追加しました
 
メモリ不足 (OOM) を回避するための 3 つの新しい CloudWatch メトリクスを追加しました。
 
メモリ不足 (OOM) を回避するための 3 つの CloudWatch メトリクスを実行合計から増分カウンターに変更しました。
 

グローバルステータス変数

内部一時テーブルで使用されるメモリの量を示す 2 つのグローバル ステータス変数を追加しました。
 

グローバルステータス変数のとは


Aurora MySQL3系では過去の記事でも取り上げたある事象がありました。
 
temptable_max_ramというパラメータがMySQL8.0から追加されており、これは以下の値がデフォルトで設定されています。
  • 一時テーブルの共通メモリプールの最大値
  • デフォルトは16 GB以上のメモリを持つ DB インスタンスは 、 16GB未満の DBインスタンスでは
 
上記記事から一部引用します。
Aurora MySQL Version3(MySQL8.0)から一時テーブルのデフォルトがTempTableストレージエンジンになりました。
TempTableは一時テーブルをメモリー上に作成しますが、サイズが設定値を超えた場合、オーバーフローしたデータをストレージに保存します
まずローカルストレージに書き込み、そこも溢れたら共有クラスタボリュームに書き込みます。
しかし、Auroraのリーダーインスタンスは共有クラスター・ボリュームに書き込みができないため、ローカルストレージが溢れた時点でクエリがエラーとなります。
Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL より引用
Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL より引用
 
つまり、今回追加された2つのグローバルステータス変数で以下の内容が確認できるようになります。
    • 内部一時テーブルによって使用されている現在のメモリ量(バイト単位)。
    • 前回の再起動以降、内部一時テーブルによって任意の時点で使用されたメモリの最大量 (バイト単位)。
 
 
これによってtemptable用に設定しているメモリが溢れそうにないかを監視できるので、リーダーインスタンス側でのクエリエラー発生を回避できるようになります。

低速なSELECT COUNTは改善されたのか?


もう一つ、以前のブログ記事でMySQL8.0でSELECT COUNTが遅くなるという記事を書いています。
この記事では、 MySQL8.0がMySQL5.7と比べてSELECT COUNTが数十倍遅くなる場合があったが、MySQL8.0.37で改善された  ということを書いています。
 
MySQL8.0.39互換の新エンジンでは改善されているのでしょうか。検証してみます。
 

再現検証

テーブルの作成とデータの生成
 

COUNT結果

Aurora MySQL 3.08.0(MySQL8.0.39互換)
 
一応、一つ前のエンジンバージョンでも確認しておきます。
Aurora MySQL 3.07.1(MySQL 8.0.36互換)
 
30万件のレコードで12秒もかかっていたSELECT COUNTが0.068秒に改善されていることが確認できました。
 

LTSの3.04系よりサポート期間は短い点は注意


素晴らしい改善点が多い3.08.0ですが、サポート期間はLTSではないので短い点に注意しましょう。
 
3.08の標準サポート期限は約1年後の2025年11月30日までとなっています。
LTSの3.04は2026年10月31日までですので、それより短い期間となります。

終わりに


今回の3.08.0のリリースでは、気になっていた部分がかなり改善されたと感じています!
AWSさんありがとうございます!!
他にもたくさんの機能改善がされていますので、ぜひリリースノートをご確認ください。
 
SRG では一緒に働く仲間を募集しています。 ご興味ありましたらぜひこちらからご連絡ください。
 
このエントリーをはてなブックマークに追加