2008-09-06 47 views
9

私はWebapp開発の問題を抱えていますが、私が見ているパフォーマンス上の問題を回避できる他のアイデアを見つけようとしています。ハウツー:ランキングの検索結果

問題声明:

  • ユーザーがエントリ場合は、各トークン
    • すなわちのための1件の結果を必要とする
    • トークンとの一致のためのアプリケーションを検索し、いくつかのキーワード/トークン
    • に入ります3つのトークンを持っている、私はエントリIDが3回必要です
  • が走ったポイントの値がある場合のポイントに基づいて、エントリIDは
  • 同じ、利用日がソートするトークンの試合のために結果に
  • ソートを
    • アサインXポイントをk個の結果

何Iできないようにしたいと思っているが、in()の結果に似たものを返す1つのクエリを送信するが、各トークンの重複したエントリIDを返すのは、チェックされた各エントリIDに一致する。

トークンごとに1つのクエリを実行する複数の個別のクエリを使用するよりも、これを行うための良い方法はありますか?もしそうなら、それらを実装する最も簡単な方法は何ですか?

編集
私はすでにエントリをトークン化するので、例えば、「実行」、「スポット」、「見る」、1のエントリIDを持っている「スポット実行が見る」と、3つのトークンましたが、テーブルは次のようになりますので、エントリーはそれらに関連したIDを持つものは、別のトークンのテーブルにあります。

'see', 1 
'spot', 1 
'run', 1 
'run', 2 
'spot', 3 

答えて

6

あなたは、MySQLで「UNION ALL」を使用して1つのクエリでこれをachiveことができます。 ALL各トークンのためのUNIONを作成するPHPのトークンによる

だけループ:

例えばトークンは、「X」、「Y」とクエリがこの

SELECT * FROM `entries` 
WHERE token like "%x%" union all 
    SELECT * FROM `entries` 
    WHERE token like "%y%" union all 
     SELECT * FROM `entries` 
     WHERE token like "%z%" ORDER BY score ect... 
のようなものに見えるかもしれ「Z」である場合に

注文句は、結果セット全体で動作する必要があります。これは必要なものです。

パフォーマンス面では、それほど高速ではありませんが、データベースでは、速度面での主なオーバーヘッドが、PHPからデータベースエンジンにクエリを送信して結果を受け取ることがよくあります。この手法では、これはトークンごとに1回ではなく1回発生するため、パフォーマンスが向上します。十分かどうかわかりません。

+0

@rmbarnesを - それらのUNIONのOPSは、私が戻って突然意味をなさないデシベル基礎年で見たところ、これがなければなりません。私はdefintiely全体の速度で比較する方法を見るために実行パフォーマンスdefintielyを与えるでしょう – warren

+0

ユニオンだけでなく、UNIONを使用することを忘れないでください。そうでなければ、あなたが望むように同じIDで返された複数の行を取得するとは思わない。 - rmbarnes Sep 20 '08 at 20:23 – warren

1

あなたはまた、あなたのクエリに以下のパーツ含めることができALLパターンUNIONを使用している場合:これは、それがためにあなたにマッチの周波数を取得し、本当に些細な例ですが

SELECT COUNT(*) AS C 
... 
GROUP BY ID 
ORDER BY c DESC 

をそれぞれの結果とこれは擬似ランクで始まる可能性があります。

0

データベースではなく検索タスク用に設計されたデータ構造を使用すると、パフォーマンスが大幅に向上するでしょう。たとえば、inverted indexのビルドを試してみてください。しかし、あなた自身で書くのではなく、ほとんどの作業を行うLuceneのようなものを調べることもできます。

3

の質問に対する回答ではありませんが、テーブルが数百万行ではなく数千である場合は、のFULLTEXTソリューションが最適な方法でしょう。

MySQLでは、インデックス付きの列でMATCHを使用すると、提供する各キーワードに関連性スコア(各キーワードが記載された回数でおおよそ計算されます)が与えられます。これはあなたの方法よりも正確であり、複数のキーワードの場合

はこちらをご覧ください: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html