2013-05-16 7 views
9

に参加し、私は次のクエリのビッグああ性能を把握しようとしています:ビッグああパフォーマンスは、二つのインデックス

SELECT * 
FROM table1 INNER JOIN table2 ON table1.a = table2.b 
GROUP BY table1.a 

table1.aは、テーブルの主キーです。 table2.bにはユニークではないインデックスがあります。

O(log n)で各インデックスを検索できるので、このクエリはO(log n * log m)で実行されます.nはテーブル1の行数、mは行数です表2に記載されています。

+0

投稿する前に有効なクエリを作成してください。これは有効なANSI/ISO SQL構文ではなく、MySQLでも(['ONLY_FULL_GROUP_BY'設定(http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode)で)エラーをスローします。 html#sqlmode_only_full_group_by)) –

答えて

12

あなたの考えはちょっとです。 1回の検索でO(log n)で索引を検索できます。あなたのクエリはおそらくこれらの "n"または "m"を実行しています。

は私がクエリが一つのテーブルをスキャンし、他の値を調べることにより、2つの表を結合することにより、処理することを想定してみましょう。次に、order byのソートベースの集計を行います。

クエリの "マッチング" ピースは、その後の大きい:

  • O(MログN)
  • (N Mログ)

    • Oこれは、そのクエリを想定しエンジンは1つのテーブルをスキャンし、他のテーブルのインデックスの値を参照することを決定します。続行するに

      あなたが値を検索後、あなたは、インデックスを使用し、テーブルのためのページ内のデータをフェッチする必要があります。データの取得は技術的にはO(n)です。ここまでの推定はO((n log m)+ n +)である。

      ソート後にスキャンが行われる場合、集計はO(n log n)でなければなりません。しかし、集計にはいくつのレコードがありますか?あなたは、n * mの数のマッチをジョインに持つことができます。または、0(これは内部結合)です。

      これは上限であるbig-Oです。したがって、より大きな見積もりを使用する必要があります。これにより、集計のO((n * m)log(n * m))が得られます。これは他の項を支配します。 big-OはO((n * m)log(n * m))となります。

    +0

    "一致する"部分が "より大きい"と言います。あなたは「より小さい」という意味ではありませんか? 1つのテーブルに2つの行があり、もう1つのテーブルに200万がある場合、クエリオプティマイザは小さなテーブルを選択し、より大きなものに対してルックアップを実行する必要があります。右? @BMiner。 – BMiner

    +0

    。 。 「ビッグ・オハイ」が上限です。それがより大きな理由です。 –

    +0

    申し訳ありませんが、どういう意味ですか?あなたは(ビッグオハイオ州のために)、クエリオプティマイザアルゴリズムが結合を計算するための "安い"ルートを選択すると仮定することはできませんか? – BMiner

    0

    クエリのパフォーマンスは、SQL文が内部的にどのように実行されるかによって異なります。

    EXPLAIN(MySQLの場合:http://dev.mysql.com/doc/refman/5.1/en/explain.html)を見れば、Big-Ohを見るよりも正確な結果が得られるかもしれないので、クエリがどのように実行されるかについての詳細を知ることができます。

    Btw:Big-Ohを本当に探しているのなら、Gordon Linoffの答えがよさそうですね!

    関連する問題