0

パフォーマンスへの影響をできるだけ少なくしてこれを行う最善の方法について少し苦労しています。

これがセットアップです...

新しい (洗練された) 結果セットを返す PHP ハンドラーへの AJAX 呼び出しを行う検索絞り込みフィルターを含む検索結果ページ。

PHP ハンドラー コードで接続する必要があるすべてのデータを含む 4 つのテーブルがあります。

表 1 - 主な詳細を含むレコードのメイン テーブル

表 2 - プロの格付け会社 #1 による各製品の格付け

表 3 - プロの格付け会社 #2 による各製品の格付け

表 4 - プロの格付け会社 #3 による各製品の格付け

検索結果ページの絞り込み条件は、許容される最低評価から最高評価までの範囲を持つ jquery スライダーです。

スライダー ハンドルを移動すると、新しい値で新しい AJAX 呼び出しが行われ、データベース クエリが実行されて、洗練された結果の新しいセットが作成されます。

表 1 から必要なデータを取得するのは簡単です。私が苦労しているのは、他の3つのテーブルに結合を効率的に含め、絞り込み値/範囲に一致する行のみを選択する方法です。表 2、3、および 4 にはすべて、年 (2004 年から 2012 年) の複数の列があり、最初にすべてを 1 つのクエリに入れようとしたときに行き詰まりました。

表 2、3、および 4 は、表 1 の各レコードのさまざまな評価を保持します。

表 2、3、および 4 の列は... id - productID - y2004 - y2005 - y2006 - y2007 - ... おわかりでしょう。

各年の列には、各レコードの数値があります (デフォルトは 0)。

私がしなければならないことは、一度に 4 つのテーブルすべてでユーザーが選択した絞り込み条件の範囲に一致するレコードを効率的に選択することです。

絞り込み検索の例は次のようになります...価格が 25 ドルから 50 ドルである表 1 からすべてのレコードを取得し、かつ表 2 のレコードの評価が (任意の年/列から) 1 ~ 4 であり、かつ表 3 のレコードの評価が (任意の年/列から) 80 から 100 の間で、かつ、表 4 のレコードの評価が (任意の年/列から) 80 から 100 の間である場合。

これを可能な限り多くのパフォーマンスでセットアップする方法に関するアドバイスはありますか?

4

1 に答える 1

2

私の提案は、別のテーブル構造を使用することです。表 2、3、および 4 をratings次の構造の単一の表にマージする必要があります。

id | productID | companyID | year | rating

次に、クエリを次のように書き換えることができます。

SELECT *
FROM products p
JOIN ratings r ON p.id = r.productID
WHERE p.price BETWEEN 25 AND 50
    AND (
        ( r.companyID = 1 AND r.rating BETWEEN 1 AND 4 )
        OR ( r.companyID = 2 AND r.rating BETWEEN 80 AND 100 )
        OR ( r.companyID = 3 AND r.rating BETWEEN 80 AND 100 )
    )

そうすれば確実に成績は上がります。また、テーブルは、年数と会社数の両方で、よりスケーラブルになります。

もう 1 つ: テーブルに多数のフィールドがある場合はproducts、結合する代わりに 2 つのクエリを実行する方が便利な場合があります。この理由は、冗長なデータを取得しているためですproduct。一度しか必要としない場合でも、結合されたすべての行に の列があります。これは結合の副作用であり、結合するよりも 2 回クエリを実行した方が便利なパフォーマンスのしきい値が存在する可能性があります。それが事実であるかどうか/いつであるかを決定するのはあなた次第です.

于 2012-08-25T19:33:36.790 に答える