MySQL 8は多機能で高性能なデータベースですが、リソースを大量に消費することが知られています。特にメモリを多く使用する設定がデフォルトとなっているため、1GBのメモリしかない仮想マシン環境では適切に調整しないとメモリ不足に陥り、パフォーマンスが低下することがあります。この記事では、仮想マシンのメモリが1GBという制約下で、MySQL 8のメモリ使用量を最適化するための設定方法について解説します。
1. 現状のメモリ使用状況を確認する
まず、MySQL 8がどれくらいのメモリを使用しているかを確認します。次のコマンドでシステムとMySQLのメモリ関係の状況を確認できます。
$ TOP
トータルメモリ961MBに対してすでに821.3MB使用されていることが分かります。
このサーバにはalamaLinux9 + WordPress + mysqlを載せているのですが、Wordpressで重い処理(画像貼り付け)を行うと操作を受け付けなくなってしまいます。

2. InnoDB Buffer Poolのサイズ調整
InnoDB Buffer Poolは、MySQLで最もメモリを消費する設定の一つです。デフォルトでは非常に大きなサイズに設定されていることが多いため、1GBのメモリしかない仮想マシンではかなり縮小する必要があります。
推奨設定として、以下の値をMySQL設定ファイルに追加・修正します。
※MySQL設定ファイルはインストール環境によってパスが異なるので探してみてください
通常のディストリビューションパッケージインストール(Debian/Ubuntu, RHEL/CentOSなど)
/etc/mysql/my.cnf
(Debian系、Ubuntuなど)/etc/my.cnf
(RHEL系、CentOSなど)
サブディレクトリの追加ファイル
/etc/mysql/mysql.conf.d/
(Ubuntu系)/etc/mysql/conf.d/
(Ubuntu系)/etc/my.cnf.d/
(RHEL/CentOS系)
[mysqld]
innodb_buffer_pool_size = 128M
仮想マシンのメモリが1GBの場合、この設定でMySQLが使用するメモリを128MBに制限します。Buffer Poolはデータベース内のキャッシュとして機能するため、これを減らすことでメモリ消費を大幅に削減できます。
3. innodb_log_buffer_sizeの縮小
InnoDB Log Bufferは、トランザクションデータの書き込みに使用されるメモリ領域です。デフォルトでは16MBに設定されていますが、1GBメモリ環境ではこれも小さく設定する必要があります。
[mysqld]
innodb_log_buffer_size = 4M
これにより、ログバッファのメモリ消費を削減し、少ないメモリ環境でも動作を安定させます。頻繁に大きなトランザクションが発生しない限り、4MBで十分です。
4. tmp_table_size と max_heap_table_sizeの調整
MySQLは一時テーブルを作成する際にメモリを使用します。tmp_table_size
とmax_heap_table_size
のデフォルト値は1GB以上のメモリを持つ環境を前提としていますが、1GBメモリの仮想マシンではこれらを縮小する必要があります。
[mysqld]
tmp_table_size = 16M
max_heap_table_size = 16M
この設定により、一時テーブルがメモリ上で消費するサイズを16MBに制限します。一時テーブルのサイズがこれを超える場合、ディスク上にスワップされるため、メモリ使用量を抑えながらパフォーマンスを維持できます。
5. スレッドキャッシュサイズの調整
MySQLはクライアント接続ごとにスレッドを生成し、それをキャッシュに保持します。スレッドキャッシュが大きすぎると、メモリを消費しすぎることになります。
[mysqld]
thread_cache_size = 4
1GBメモリの仮想マシンでは、これ以上大きなキャッシュを持つ必要はありません。接続が頻繁に切り替わる環境でない場合、4スレッドのキャッシュで十分です。
6. table_open_cache と table_definition_cacheの調整
table_open_cache と table_definition_cache は、開かれたテーブルやテーブル定義のキャッシュを管理する設定です。これらもメモリを消費するため、1GBのメモリ環境では適切に制限する必要があります。
[mysqld]
table_open_cache = 200
table_definition_cache = 200
デフォルト値では大規模なシステムを想定して大きなキャッシュサイズが設定されていますが、小規模な仮想マシンではこれらを200に減らしてメモリ消費を抑えます。
これにより、ディスクへの書き込みが最適化され、メモリへの負荷が軽減されます。
設定が入れ終わったらMySQLを再起動します。
$ sudo systemctl restart mysqld
トータルメモリ961MBに対してすでに695.9MB使用まで減らすことができました。

まとめ
1GBのメモリしかない仮想マシン環境では、MySQL 8のデフォルト設定は過剰であり、適切な調整が必要です。今回紹介した各設定を調整することで、メモリ使用量を大幅に削減し、限られたリソースでも安定して動作するようになります。これらの設定を基に、環境に最適なチューニングを行い、パフォーマンスを最大限に引き出してください。