1月 27, 2026ガイド
MySQLパフォーマンスを最適化する方法
MySQLデータベースパフォーマンスを最適化する完全ガイド:設定の調整、クエリの最適化、インデックス作成、監視。

MySQLパフォーマンスの最適化は、大量のデータや高トラフィックを処理するアプリケーションにとって重要です。このガイドは、設定の調整からクエリの最適化まで、MySQLパフォーマンスを向上させるための基本的なテクニックをカバーしています。
MySQL設定の最適化
サーバーリソースに基づいてパフォーマンスを最適化するためにMySQL設定ファイルを編集します:
bash
# MySQL設定を編集(Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# MySQL設定を編集(CentOS/RHEL)
sudo nano /etc/my.cnf
# これらの設定を追加または変更:
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 64M
query_cache_type = 1
tmp_table_size = 64M
max_heap_table_size = 64M
# MySQLを再起動
sudo systemctl restart mysql # Ubuntu/Debian
sudo systemctl restart mysqld # CentOS/RHELInnoDBの最適化
InnoDBはMySQLのデフォルトストレージエンジンです。より良いパフォーマンスのために最適化します:
bash
# /etc/mysql/mysql.conf.d/mysqld.cnfまたは/etc/my.cnfで
[mysqld]
# InnoDBバッファプール(利用可能なRAMの70-80%を使用)
innodb_buffer_pool_size = 2G
# InnoDBログファイルサイズ
innodb_log_file_size = 512M
# InnoDBフラッシュメソッド(SSD用)
innodb_flush_method = O_DIRECT
# InnoDB I/Oスレッド
innodb_read_io_threads = 4
innodb_write_io_threads = 4
# トランザクションコミット時のInnoDBログフラッシュ
innodb_flush_log_at_trx_commit = 2クエリキャッシュの設定
クエリキャッシュは読み取りが多いワークロードのパフォーマンスを向上させることができます(注:クエリキャッシュはMySQL 8.0で非推奨):
bash
# MySQL 5.7以前の場合
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# クエリキャッシュのステータスを確認
mysql> SHOW VARIABLES LIKE 'query_cache%';
# クエリキャッシュの統計を確認
mysql> SHOW STATUS LIKE 'Qcache%';インデックスの最適化
適切なインデックス作成はクエリパフォーマンスにとって重要です:
bash
# インデックス統計を更新するためにテーブルを分析
ANALYZE TABLE table_name;
# 未使用のインデックスを確認
SELECT * FROM sys.schema_unused_indexes;
# インデックスを作成
CREATE INDEX idx_column ON table_name(column_name);
# 複合インデックスを作成
CREATE INDEX idx_multi ON table_name(col1, col2, col3);
# インデックスを表示
SHOW INDEXES FROM table_name;
# 未使用のインデックスを削除
DROP INDEX idx_name ON table_name;クエリの最適化
より良いパフォーマンスのためにSQLクエリを最適化します:
- EXPLAINを使用してクエリ実行プランを分析:EXPLAIN SELECT * FROM table WHERE column = 'value'
- SELECT *を避ける - 必要な列のみを選択
- LIMITを使用して結果セットを制限
- インデックス付き列で適切なWHERE句を使用
- WHERE句での関数を避ける(例:WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
- 可能な場合はサブクエリの代わりにJOINを使用
- 適切な場合は複数の条件でORの代わりにUNIONを使用
MySQLパフォーマンスの監視
bash
# MySQLステータスを確認
mysql> SHOW STATUS;
# スロークエリを確認
mysql> SHOW VARIABLES LIKE 'slow_query%';
# スロークエリログを有効化
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
# プロセスリストを確認
mysql> SHOW PROCESSLIST;
# テーブルステータスを確認
mysql> SHOW TABLE STATUS LIKE 'table_name';
# InnoDBステータスを確認
mysql> SHOW ENGINE INNODB STATUS;パフォーマンス最適化のヒント
- テーブルをデフラグするために定期的にOPTIMIZE TABLEを実行
- スロークエリログを監視し、スロークエリを最適化
- 接続オーバーヘッドを減らすために接続プーリングを使用
- より良いパフォーマンスのために日付または範囲で大きなテーブルをパーティション化
- 読み取りが多いワークロードには読み取りレプリカを使用
- MySQLを最新の安定バージョンに更新
- ディスクI/Oを監視し、SSD/NVMeストレージの使用を検討
- 詳細なクエリ分析にはEXPLAIN ANALYZE(MySQL 8.0+)を使用