MySQL Memory capacity エラーへの対処
2024年7月25日
あるデータが大量に蓄積されたデータベースを扱った際に以下のエラーが発生して処理がストップしてしまいました。
Memory capacity of 8388608 bytes for \'range_optimizer_max_mem_size\' exceeded. Range optimization was not done for this query.
あるWHERE IN句を用いて多くの条件で検索をしている箇所でした。
IN句に渡す要素1つあたり約200バイトをメモリを消費するようで、合計値がMySQL8.0のデフォルト値の8388608を超えると全テーブルフルスキャンのなどに切り替わり、スロークエリになってしまいます。
確かに処理によってはIN句に渡している要素数は数万を超えているものがあり、これがこのエラーを引き起こしているものと判明しました。
解決策としては以下になるかと思います。
- range_optimizer_max_mem_sizeの設定値を見直す
・デフォルトは8MBなのでこれをたとえば、16MB等に変えることで改善されるかを見ます。
・0の設定値で制限なしとなります。
- クエリを分割する
・IN句を使ったクエリを複数回に分割してあげます。