AnyDigi
アイキャッチ
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句を使ったクエリを複数回に分割してあげます。