ブログに戻る
1月 27, 2026ガイド

MySQLパフォーマンスを最適化する方法

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/RHEL

InnoDBの最適化

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+)を使用