MySQL 8.0でSELECT COUNT(*)の性能劣化
2022
MySQL 8.0 で SELECT COUNT(*) が失速する
MySQL 8.0にて、バッファプールに乗り切らないサイズのテーブルを扱うときに性能が劣化する
2024
2024/11 Aurora MySQL 3.08.0(MySQL 8.0.39互換)がリリース!低速なSELECT COUNTは改善されたのか!?
2024/06 MySQL8.0でSELECT COUNT(*)が低速になる動作は8.0.37で解消されていた!
8.0.37で解消されたとのこと
2024/06/14時点ではAuroraの対応がまだ -> 対応された
MySQL8.0で低速になったSELECT COUNTを高速化する
原因は
https://bugs.mysql.com/bug.php?id=100597
ヒント句をつけてもセカンダリインデックスが使用されずにクラスタ化インデックス(PKのインデックス)が利用されてしまうというバグ
https://bugs.mysql.com/bug.php?id=112767
並列読み取りスレッドのページを事前に読み込む機能が、クラスタ化インデックスにおいて必要以上にページを読み込んでしまい、過剰な読み取りI/Oを引き起こしてSELECT COUNTのパフォーマンスが悪化している
回避方法
SELECT COUNTでクラスタ化インデックス(PKインデックス)の並列スキャンを利用させないようにする
ヒント句(USE INDEXやFORCE INDEX)でセカンダリインデックスを指定必須
WHERE句での条件必須