これは、MySQLをデータベースとして使用するWebサイトまたはアプリケーションを開発するときに私たち一人一人に起こりました。 パフォーマンスが突然劇的に低下し、なぜこれが起こったのかわかりませんでした。 これは多くの要因(CPU使用率が高い、ディスク容量が不足している、チャネル帯域幅が低い)によって引き起こされる可能性がありますが、必要以上に完了するまでに時間がかかる最適化されていない要求である可能性もあります。
どのクエリが最も長く実行されているかを知るにはどうすればよいですか?
MySQLには、
遅いクエリを
記録するための組み込み機能があります。
この機能を有効にするには、次のいずれかのアクションを実行する必要があります。/etc/my.cnf
次の行を追加します。
log-slow-queries=/tmp/slow_queries.log
long_query_time=10
- 次のパラメーターを指定して
mysqld
を呼び出します。
–log-slow-queries[=/tmp/slow_queries.log]
long_query_time
は、クエリがスロークエリログに書き込まれるまでに実行できる最大秒数です。
その他の関連オプション:–log-slow-admin-statements
OPTIMIZE TABLE
、
ANALYZE TABLE
、
ALTER TABLE
などの遅い管理ステートメントをログに記録し
OPTIMIZE TABLE
。
–log-queries-not-using-indexes
このオプションを
–log-slow-queries
とともに使用すると、インデックスを使用しないクエリは低速クエリに記録されます。
遅いクエリのロギングが正常に有効になっている場合、行「
log_slow_queries
」の「
Value
」列に「
ON
」が表示されます(上の図を参照)。
注:キャッシュされたリクエストは記録されません。 また、テーブルに0または1つのレコードがあるためにインデックスが役に立たないクエリは記録されません。
特定の条件(ログに書き込むとき)でのみ要求がゆっくり実行される状況が発生する場合がありますが、手動で開始すると、要求は正常に実行されます。
- テーブルはロック(ロック)できるため、要求は待機キューに入れられます。 この場合、
lock_time
は、テーブルがロック解除されるタイミングと、リクエストが処理される時間を決定します。 - データとインデックスはキャッシュされませんでした。 これは通常、MySQLを初めて起動したとき、またはテーブルが最適化されていないときに発生します。
- ディスクを遅くするサードパーティ製プロセスが起動しました。
- この時点でサーバーは他の要求で過負荷になっており、効率的な操作を行うのに十分なCPUリソースがありません。
ログ分析MySQLには
mysqldumpslow
ユーティリティが含まれています。これは、ログデータを要約し、スロークエリが実行される頻度を視覚的に表示するPerlスクリプトです。
——————————–——————————————————
公平に、私は自分自身からいくつかの言葉を追加したいと思います。
これはまだ翻訳であり、独自の記事ではないので、著者が書いたものを可能な限り正確に翻訳しようとしました。
しかし、この小さな記事に興味がある人のために、公式のMySQLマニュアルでこの機能について読むことをお勧めします。
参照:
dev.mysql.com/doc/refman/5.0/en/slow-query-log.html-英語版
www.mysql.ru/docs/man/Slow_query_log.html-ロシア語版
PS:これは、記事でいくつかの誤ったアクションが説明されていることを意味するものではありません。 素敵なボーナス(: