web-dev-qa-db-ja.com

テーブルをスキャンするクエリを特定するMySQLスロークエリログ

MySQLには、SOMEインデックスを使用していてもテーブルスキャンを実行するクエリを表示する設定がないようです

パフォーマンスの低いクエリがいくつかあり、それらを体系的に見つけることを望んでいましたが、log_queries_not_using_indexes設定は、全テーブルスキャンを使用するのではなく、NO INDEXES AT ALLを使用するクエリを検索するだけのようです。

確認する人はいますか?新しいオプションはありますか?

1
user2415376

log_queries_not_using_indexesは役に立たないと思います。より便利なのは、時間がかかるクエリです。これは include 一部またはすべてのテーブルスキャンを行うクエリおよびは低速ですが、 exclude 簡単なテーブルスキャン高速です

テーブルに5つの行がある場合、インデックスを使用するか、テーブルスキャンを実行するかは問題ではありません。速度はほぼ同じです。

これらは、作業する最も重要なクエリから始まります。最初の3つに取り組み、影響が発生するのを待って、新しいスローログを取得することをお勧めします。

mysqldumpslow -s t   # to sort by most impact first
pt-query-digest

また、long_query_time=1は、おそらく良い出発点です。

(私は地面に耳を傾けています。あなたが提案するオプションのことは聞いていません。あなたは could に「機能リクエスト」をbugs.mysql.comで提出してください。)

その他

オプティマイザーは、テーブルスキャンがインデックスを使用するよりも高速である可能性が高いと判断する場合があります。これは、20%以上の行が操作されると推定された場合に発生します。 ( "20"は月の満ち欠けによって異なります。)これは、セカンダリインデックスのBTreeとBTreeが持っているデータの間で跳ねるためです。

2
Rick James

スロークエリログを有効にして、スロークエリの詳細を取得できます。

slow_query_log=1
slow_query_log_file="queries-slow.log"
min_examined_row_limit=5000

最後の設定では、要件ごとに行数を調整してください。高い数値から始め、徐々に減らします。これらの設定は、set globalを使用して設定することもできます。ログファイルには、スキャンされているテーブルの行数が表示されます。その数がテーブル内のレコードの総数に近い場合、そのテーブル全体のスキャンが行われます。これにより、過剰な数の行がスキャンされる原因となっているクエリを特定できます。

0
Allen King

MySQL 5.7-5.4.5 The Slow Query Log のドキュメントに関する限り...

スロークエリログに書き込まれるステートメントの行ルックアップにインデックスを使用しないクエリを含めるには、log_queries_not_using_indexesシステム変数。

... and

log_queries_not_using_indexes

インデックスを使用しないクエリがスロークエリログに記録されるかどうか。セクション5.4.5「スロークエリログ」を参照してください。

noについての言及はlog_queries_using_table_scans、または類似したもの。 MySQL 8のドキュメント-5.1.5サーバーシステム変数 にも言及はありません。

だから、答えはnoだと思います。オプションはありません(少なくとも、これまでに文書化されています)。したがって、私の推測では、allすべての遅いクエリをログに記録し、後でテーブルスキャンを実行するクエリと実行しないクエリを確認する必要があります。

mysqldumpslow ユーティリティが役立つ場合があります。 MySQLスロークエリログ:ツールとヒント および スロークエリログを解析するためのツール も参照してください。

0
joanolo