2011-03-26 9 views
2

私は顔マッチWebアプリケーションを構築しています。どちらがパフォーマンスに優れていますか?クロス結合または新しいテーブル?

注:私は、人々がこのタイプのアプリケーションを顔面修正アプリケーションと呼んでいないことを知りました。

ここには基本的なワークフローがあります。

  1. ユーザーの写真に
  2. 管理者ユーザーがページにアクセスしたときの写真
  3. を拒否/承認のいずれかをアップロードし、写真2枚がランダムにデータベースから選択されています。
  4. ユーザーには2つのオプション
    1. は、1つの条件があり、別の試合に

をスキップ

  • 写真のいずれかを選択しています。ユーザーには重複した一致が表示されません。ユーザーが1対2で既にプレイしている場合、ユーザーは再び2対1を表示しません。

    のは、私が6つの可能な一致がある

     
    id 
    1 
    2 
    3 
    4 
    

    以下の4枚の写真

    テーブルの写真を持っているとしましょう。それらは、これらの一致を行うために

     
    1 vs 2 
    1 vs 3 
    1 vs 4 
    
    2 vs 3 
    2 vs 4 
    
    3 vs 4 
    

    です。次のクロス結合クエリを使用します。

    select p1.id, p2.id from photos as p1 cross join photos as p2 where p1.id < p2.id 
    

    問題なく動作します。私の懸念は、マッチの数が増えるにつれて遅くなることです。

    2000000枚の写真と1999000のマッチが得られます。それはそのような巨大な数です。

    私は解決策を考え、すべての可能性のあるマッチを格納する新しいテーブルを作成することになりました。管理者が写真を承認すると、行が作成されます。

    テーブルは最終的に

     
    id1 id2 
    1 2 
    1 3 
    1 4 
    and so on 
    

    と一致し、私の質問は

    私はクロス結合を使用しておくべきか、私は「にマッチ」新しいテーブルを作成する必要がありますか?

    どれが良いでしょうか?

    その他の優れた解決策があります。

    答えて

    2

    私はこの場合、あなたはもっと良いと思いますはまったくマッチしません。あなたが理解したように、マッチの数は行の数に対して2次です。あなたのユースケースに基づいて、ユーザーごとにすべてのペアが表示されたテーブルを保持し、そのユーザーを照会するときにそれらを除外する方が良いようです。これはおそらく、組み合わせ全体の空間に比べてかなり疎です。管理者が承認した時点ですべての組み合わせのデータを保存する必要がなければ、その時点で生成する必要はありません。

    +0

    //お返事ありがとうございます。私の懸念は...多くの同時接続がある場所では遅いかもしれません。レットは50000と言います。私のMYSQLはこのクロス結合クエリで大丈夫でしょうか? – Moon