0

遅いデータベースをデバッグするための優れた一般的なガイドを知っている人はいますか?

非常に遅く実行され、データベース呼び出しでハングまたはクラッシュする Web サイト (私が作成したものではありません) (MySQL バックエンドを備えた ZendPHP サイト) をデバッグするように依頼されました。

私は SQL を使用することに満足していますが、自分自身を DevOps タイプまたはデータベース開発者とは決して言いません。最初に尋ねる賢明な質問を知りたいです。

可能なアプローチを示唆するものを探しています。

  • データベースの速度が低下しているときを監視することから始めるべきだと思います-どうすればよいですか?
  • 速度が低下していることがわかったら、それらの特定のデータベース呼び出しをデバッグするにはどうすればよいでしょうか?
  • サーバー上で実行されている他のプロセスがデータベースの速度を低下させている可能性はありますか? それらをデバッグするにはどうすればよいですか?

そして、それぞれの場合に取るべき一般的な戦略。

この質問が一般的すぎないことを願っています。このようなガイドは、多くの開発者にとって非常に役立つと思います。

4

1 に答える 1

1

最初のステップは、データベースが遅いときにデータベースが何をしているかを調べることです。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バッファリングを利用することに注意してください。つまり、特定のデータブロックに一度アクセスすると、カーネルが必要とするまでバッファに残ります。そのメモリスペースを解放します。つまり、同じクエリを何度も実行すると、そのクエリ特に非効率的である場合、毎回同じ結果が得られない可能性があります。

特定のクエリとスキーマに関する詳細情報を投稿すると、もう少し詳しく調べることができます。

于 2012-07-05T20:28:17.847 に答える