最初のステップは、データベースが遅いときにデータベースが何をしているかを調べることです。MySQLでこれを行う最も簡単な方法は、slow_query_logを使用することです。いくつかの賢明な設定は次のとおりです。
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes
これを有効にすると、次のように表示されます。
# User@Host: myuser[myuser] @ localhost [] # Query_time: 10.000347 Lock_time: 10.000094 Rows_sent: 2 Rows_examined: 4
SET timestamp=1341519484;
select * from (mytab) where (field=value);
実行速度が遅いクエリを特定したら、同じクエリを手動で再度実行して、何が起こっているかを確認できますが、今回は接頭辞「explain」を付けます。
mysql> explain select * from mytab;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | mytab | ALL | NULL | NULL | NULL | NULL | 189 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
次に、不足しているインデックス、不要なリクエストがあるかどうかなどを特定できます。スキーマに関するいくつかの情報が役立ちます。
sarやtopなどもインストールする場合(たとえば、/ etc / init.d / atopを編集して間隔argを「60」に変更し、/ etc / init.d /を実行して、サンプリングレートを十分に低く設定します。再起動時に)slow_query_logにリクエストが表示されたときのサーバーの動作を相互に関連付けて、他のシステム競合の問題があるかどうかを判断できます。
MySQL(または実際にはO_DIRECTを使用しないほとんどのアプリケーション)のようなデータベースはIOバッファリングを利用することに注意してください。つまり、特定のデータブロックに一度アクセスすると、カーネルが必要とするまでバッファに残ります。そのメモリスペースを解放します。つまり、同じクエリを何度も実行すると、そのクエリが特に非効率的である場合、毎回同じ結果が得られない可能性があります。
特定のクエリとスキーマに関する詳細情報を投稿すると、もう少し詳しく調べることができます。