なぜMySQL 8のデフォルト設定では不十分なのか?
MySQL 8をインストールしてそのまま運用するのは、駆け出しのシステム管理者が陥りやすい「罠」です。デフォルト設定は、Raspberry Piのような非力なデバイスでも動作するように設計されていることを知っておく必要があります。16GBや64GBのRAMを搭載した本番サーバーでそのまま動かすと、MySQLはリソースのわずかな一部しか使用しません。その結果、アクセスが増えるとウェブサイトが重くなったり、最悪の場合はフリーズしたりすることになります。
実を言うと、以前32GB RAMのサーバーで動くECサイトを管理していた際、データベースの動作が非常に重いことがありました。調査したところ、innodb_buffer_pool_sizeがデフォルトの128MBのままでした。そのため、MySQLがRAMではなくディスクから頻繁に読み書きを行い、Disk I/Oが常に100%に達していました。この数値を20GBに引き上げたところ、サイトのレスポンス速度は即座に5倍に向上しました。
クイックスタート:8GB RAMサーバー向けの設定例
すぐに使える標準的な構成が必要な場合は、/etc/mysql/my.cnfを開いてください。以下のコードを書き込む前に、必ず元のファイルのバックアップを取っておきましょう。
[mysqld]
# 1. バッファプール(最重要)
innodb_buffer_pool_size = 5G
# 2. 接続管理
max_connections = 500
max_user_connections = 450
# 3. ディスク書き込みの最適化
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# 4. 一時テーブルとソート
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 2M
# 5. MySQL 8固有の設定
innodb_dedicated_server = OFF
サービスを再起動して変更を適用します:
sudo systemctl restart mysql
パフォーマンスに直結する重要パラメータの分析
1. innodb_buffer_pool_size:パフォーマンスの要
これは、MySQLがデータとインデックスをRAM上に保持するための領域です。RAMからのデータ取得は、SSDからの読み込みよりも数千倍高速です。
- 原則:大きければ大きいほど良いですが、サーバーがメモリ不足(スワップ)にならないように注意してください。
- 配分の目安:Nginx/PHPと同じサーバーで動かす場合は、RAMの40-50%をMySQLに割り当てます。データベース専用サーバーの場合は、75-80%まで上げることができます。
MySQL 8には、この数値を自動計算するinnodb_dedicated_server = ONという機能があります。ただし、サーバーで他の重いアプリケーションを動かしていない場合にのみ有効にすることをお勧めします。
2. max_connectionsを増やしすぎない
「Too many connections」エラーが出たからといって、安易に2000や5000に増やすのは致命的な間違いです。各接続はバッファのために一定量のRAMを消費します。
例えば、1接続あたり2MBを消費すると仮定すると、5000接続では待機状態を維持するだけで10GBものRAMを使い果たしてしまいます。接続数を増やす代わりに、使用後すぐに接続を閉じるようにコードを最適化してください。システムが非常に大規模な場合は、ProxySQLを使用してコネクションプールを効率的に管理することを検討しましょう。
3. 安全性と速度のバランスを考えたログ書き込み
パラメータ innodb_flush_log_at_trx_commit は、データがディスクに書き込まれるタイミングを決定します:
- 値 = 1:完全な安全性。トランザクションごとにディスクの確認を待つため、最も遅くなります。
- 値 = 2:多くのシステムにとって最適な選択肢。データは1秒ごとにOSキャッシュに書き込まれます。MySQLがクラッシュしてもデータは失われません。サーバーが突然停電した場合には約1秒分のデータが失われる可能性がありますが、パフォーマンスとのバランスが良いです。
- 値 = 0:爆速ですが非常にリスクが高いです。重要でないログや一時的なデータにのみ使用してください。
Sort BufferとJoin Bufferに関する注意点
クエリを高速化するためにsort_buffer_sizeを数百MBに設定する人がいますが、これは避けてください。このバッファは接続ごとに割り当てられます。500ユーザーがいる状態で128MBに設定すると、ピーク時には数分でメモリ不足になりサーバーがダウンします。1MB〜4MB程度に抑え、SQL文の適切なインデックス作成に集中しましょう。
専門家によるチューニング手順
一度に10個ものパラメータを変更してはいけません。リスクを管理するために、以下の手順に従ってください:
- 一度に変更するのは最大2つまで。
- 少なくとも24時間はCPU、RAM、スロークエリログを監視する。
<a href="https://itfromzero.com/ja/database/mysql-ja-database/mysqltuner%e3%81%a7mysql-server%e3%81%ae%e8%a8%ad%e5%ae%9a%e3%82%92%e8%a8%ba%e6%96%ad%e3%83%bb%e9%ab%98%e9%80%9f%e6%9c%80%e9%81%a9%e5%8c%96%e3%81%99%e3%82%8b%e5%ae%9f%e8%b7%b5%e3%82%ac%e3%82%a4.html">mysqltuner.pl</a>ツールを使用して、稼働中のデータから実際の推奨事項を取得する。
このスクリプトは非常に簡単に実行できます:
wget http://mysqltuner.pl/ -O mysqltuner.pl
perl mysqltuner.pl
これにより、インデックスが不足しているテーブルや、設定値が低すぎるバッファが正確に特定されます。MySQLの最適化は継続的な微調整のプロセスであり、固定された公式はありません。まずはRAMとI/Oから着手すれば、システムの動作が格段にスムーズになるのを実感できるはずです。

