2017-08-17 6 views
0

私はMySQLデータベースのクエリを最適化する過程にあります。 Visual Explainを使用していて、さまざまなクエリのコストを見ている間、私は繰り返し、直感的な値を見つけています。より効率的な検索(例えば、キールックアップ)を使用する操作は、表面的に効率の悪い操作(例えば、全テーブルスキャンまたは全インデックススキャン)よりも高いクエリコストを有するように見える。 enter image description here 全表スキャンの照会コストは、キーのルックアップベースのクエリコストの割合である:本のクエリのコストは、MySQLのクエリ最適化に最適なメトリックですか?

例としては、さらにビジュアルthis pageに説明に関するセクションでは、MySQLのマニュアルに見ることができます。私は自分のデータベースで全く同じシナリオを見ます。

これは私にとって完全に逆に思えますが、質問を最適化するときにクエリコストを標準として使用する必要がありますか?それとも、私は根本的に誤解されたクエリコストを持っていますか?

+0

「実際のパフォーマンス」は通常、最も重要なものです。推定された(実際の)クエリプランは素晴らしいです。一方、関連するクエリを手軽に実行させることは、一般に要件です。 – user2864740

+0

また、私は質問が何を求めているのかよくわかりません。基本FTSのコストは、それがクエリに答えるために必要な情報の一部に過ぎないので、意味がありません。(テーブルに適切なインデックスとデータ量がある場合は、フルスキャンからインデックススキャンに変更する必要があります:このステップでは、効果的に「最初のN [1000]行を作成します」このケースでは、または使用可能なインデックスがありません。) – user2864740

+0

私は、クエリの各ステップが何をしているのか、それがどのようになっているのかを理解しています。私が理解できないことは、例外なく、ほぼ例外なく、クエリプランナーは、常識的にそうでないと指摘された場合、インデックス付きの読み取りは非インデックス化された読み取りよりも高価だと考えていることです。たとえば、私のデータベースでは、フル・テーブル・スキャンを実行しているクエリが見つかったので、適切なインデックスを追加し、プランナがそのインデックスを選択しましたが、EXPLAINはその変更後にクエリコストが**アップ**したことを示しました。 –

答えて

0

一例:

あなたが1000個のフランス語の単語やフランス語、英語(非電子)辞書のリストを持っています。あなたの仕事は1000フランス語の単語とその英語の翻訳でテーブルを作成することです。

最初の手順:リストのフランス語をテーブルの最初の列に書き込みます。

第2ステップ:辞書の各単語の翻訳を見つけて、2番目の列に書き込みます。

あなたはどちらのステップに時間がかかると思いますか?

0

MySQLには最適化に関するメトリックがありません。より良いものの1つはEXPLAIN FORMAT=JSON SELECT ...ですが、それは多少秘密です。

いくつかの '深刻' な欠陥:

  • はめったにLIMITのために何もアカウントもしません。
  • インデックスの統計情報は粗末であり、不均一な分布は許されません。 (ヒストグラムはすぐに来ています)
  • データ/インデックスが現在キャッシュされているかどうかはほとんどなく、回転ドライブやSSDがあるかどうかはほとんどありません。

それもタイミングが無用の隣にある小さなテーブルのために、私は2つの製剤/インデックス/などを比較することができますので、私はこれが好き:

FLUSH STATUS; 
perform the query 
SHOW SESSION STATUS LIKE "Handler%"; 

それは(EXPLAINとは違って)正確なカウントを提供する読み取り、一時テーブルへの書き込みなどがあります。主な欠陥は、読み取り/書き込みに要する時間(キャッシュ、インデックスルックアップなど)を区別しないことです。しかし、クエリがテーブル/インデックススキャン対ルックアップスキャンか複数スキャンかを指摘するのは非常に優れています。