2009-08-15 12 views
4

Iveには数千の製品と50人程度の認証済みユーザのテーブルがあります。リストごとにソートされたユーザごとに

これらのユーザーはすべて、自分のWebサイト上の製品を示し、それらはすべて彼らが異なっ注文持つ能力を必要とします。私はPRODUCT_ID、USER_IDと順番列を含む注文の別々のテーブルのいくつかの種類が必要

イムguesing?

私は、データベースに何百万もの製品を取得した場合に遅く、非常に高速ではなく、なるように、私は、MySQLで最も効率的にこれをどのように行うのですか。

はそれも賢明なのmysqlでそれを行うのか、私はSolrの/ Luceneのような他の指標のいくつかの種類を使用する必要がありますか?

マイProductテーブルは

私は必要な機能の良い例が、あなたは/ご注文、あなたがログインしている場合は、結果をSUPRESSできるGoogle検索で「製品」 マイUserテーブルが呼び出され、「ユーザー」と呼ばれています。

編集:製品の結果がページ分割となり、ユーザーは、製品を編集する権限を持っているそのわずか準備ができていないので、唯一の

答えて

1

あなたは何千人も、最終的にはページ上の何百万もの製品を表示している場合さて、まず、それが遅くなるだろう。私はあなたが何らかの理由でそれらを1ページあたりまあまあの数に絞り込んでいると仮定します。

とにかく、product_orderテーブルへの参加はかなり速くなります。これはプライマリキーと定数(ユーザーID)の両方の整数であり、クイックインデックスルックアップになります。私が見ることができるいくつかの問題があります。まず、各ユーザーは本当に100万個の製品の注文を定義しようとしていますか?

SELECT whatever 
    FROM 
    products p 
    LEFT JOIN products_order o ON (
     p.product_id = o.product_id 
     AND 1234 = o.user_id 
    ) 
    WHERE p.stock > 0 -- some search criteria 
    ORDER BY COALESCE(o.order, 999999999) --- arbitrarily large number 
    LIMIT 10 

ORDER BYLIMIT前に起こる:最後なしオーダー=ディスプレイを想定していない、別の問題があります。 MySQLはをすべて行に結合し、その巨大な結合(hello filesort)をソートする必要があります。その後、1,000,000行のうち999,990をスローします。

各ユーザーがいくつかの製品のみを販売していることが判明した場合、この問題は起こりません。where句はMySQLに参加し、いくつかの行を並べ替えます。各人が何百万を売っている場合は、非正規化を行う必要があるでしょう。products_orderですべてのフィルタリングを実行できるので、大量の行を避けることができます。 products_orderにはたくさんの行が必要ですが、各(製品、ユーザー)の組み合わせごとに1つずつ...あなたは残念ながらどちらかの方法で痛みを見ています。

+0

あなたの答えに感謝します。申し訳ありませんが、結果はページ単位で表示され(一度に最大50件)、各ユーザーはおそらく最初の20〜50品目のみを注文し、残りの部分は心配しないと言います。 – ADAM

+0

この場合、このアプローチはスケールされます。 FROMを、私が示したものとは逆の順序で(products_order oから製品pに参加する...)行います。これは、ユーザーが注文を入力した<50行以上を引き出すことはありません。 – derobert

0

あなたすべきは、必ずインデックス/オーダー/グループを強化する場所で発生したcolumsパフォーマンス。しかし、あなたのケースでは、それは実際にレイヤー構造に依存しますが、顧客はどのようにデータベースにアクセスしていますか?

クエリを実行できるようにMySQLデータベースに直接接続しますか?

または、Webサービスなどでアクセスしますか?

いずれかの方法顧客は、顧客の生産性を高めるために、注文の声明に変わることができるように、私は、データ層を適応させるでしょう。

+0

あなたはOPが望んでいることを誤解していると思います。彼は、製品の注文を注文したいのであって、任意の「注文」句ではありません。各ユーザーは、「この製品を最初に置く、1秒にする、など」と言うことができる必要があります。 - 単に「価格で分類された商品リストを私に渡す」ことではありません。 – derobert

+0

Mhmm、よく答えはインデックス質問です;) –

0

各ユーザーオプションを保存するテーブルを使用できません。 「インデックスロボット」システムを持っていますか?あなたのSQLクエリがはるかに高速になるこの方法。そして、なぜあなたが価値あるものとして選んだ最初の25についてだけ気にするのであれば、100 000行を返すのはなぜですか?

+0

彼らは販売のための彼らの製品であるため、最初の20-50は懸念されています。それらがすべて同じ表にリストされていることと、必要に応じてユーザーが他の属性(価格、日付、タイトルなど)で検索および注文できることも重要です。この理由のために私はtheresがSQL/normilisationより良いソリューションだと思う – ADAM

関連する問題