2009-08-08 8 views
1

ここに私のmysqlテーブルスキームです。大規模なDBの友人フィードのための私のmysqlクエリを作成するには?

  1. ステータステーブル// statusID、ユーザーID、日付、件名、日付を持っている
  2. コメントテーブル//それはあまりにも属することcommentID、掲載 ユーザーID、日付、およびstatusID を保持している
  3. ユーザテーブル/ /ユーザーIDのユーザー名を保持する とユーザーの写真URL

上記の表のスキームでは、これを行う必要があります。 DBの最小量を用いた高速

  1. 表示私の友人リストにユーザから公開されているページ上のすべてのステータスエントリが(最大5,000の友人かもしれない)
  2. は、各ステータスのすべてのコメントを表示するに照会します適切なブログ
  3. 下 エントリは、すべての ステータスエントリポスト
  4. のユーザ名/写真のURLを表示し、次にすべて コメントのポスター用のユーザー名/写真のURLを表示するが コメント

私が後にした結果は、すべてのポスト/アクションやあなたの友人のものだけを表示するmyspaceやFacebookに似ています。

このページをスタックオーバーフローと比較して、私が達成しようとしているものと比較することもできます。自分の投稿をステータスポストとみなし、このページのすべての回答をステータスポストにしてください。それぞれの下にあり、彼らはすべてユーザー情報を持っているので、これほど多くの結合やものがなければこれを達成する良い方法はありますか?

質問1
私は必要なものを達成するためにとにかくありますか?これはインデックスがあっても検索する何百万行もの行がある場合には十分速くないのですが、私の選択肢は何ですか?

質問2
それだけで各ステータスのポストのコメントの最初のX ammountを表示するには、これを変更することは可能ですか?もしそうなら、それは多くのコメントを検索する必要がないので、スピードアップしますか?友人リストの下

がクエリに既にある、その理由は、私はそれが1以下のクエリになりますので、配列に友達リストを取得し、memcacheのか、APCキャッシュに格納する予定である

ここに私のクエリ

SELECT s.statusid, s.userid, s.statustype, s.subject, 
    s.datetime, c.commentid, c.statusid, c.userid, 
    c.comment, c.datetime, su.disp_name, 
    su.pic_url, cu.disp_name, cu.pic_url 
FROM teststatus AS s 
    LEFT JOIN teststatuscomments AS c 
     ON s.statusid = c.statusid 
    LEFT JOIN friend_reg_user AS su 
     ON su.auto_id = s.userid 
    LEFT JOIN friend_reg_user AS cu 
     ON cu.auto_id = c.userid 
WHERE s.userid =1 OR s.userid 
     IN (2, 3, 4, 5, 6, 7, 8, 9, 
      10, 11, 12, 13, 14, 15, // Remember this list of friend ID's 
      16, 17, 18, 19, 20) //can be from any ammount of ID's up to 5,000 
ORDER BY s.statusid 

PS)は、私は、すぐにそれは私をすることができますように、この上の恩恵を開始しますです

+0

に参加する必要がある

ON fru.auto_id = s.userid AND fru.auto_id = c.userid 

満足できますか? –

+0

もしそうでなければ、ユーザー/フレンドの関係をそれ自身のテーブルにインデックスすることをお勧めします。 –

+0

私は実際に従っていない、友人の関係は、自分のテーブルとユーザーのテーブルは、アカウント情報を持つメインテーブルです、友人の関係テーブルは、何百万の行が長いので、多くの友人を持つことができます – JasonDavis

答えて

3

あなたの同じフィールドに基づいていますが、2つの異なる値に等しい参加するので、CA nnotこれまでに次の2つは、あなたが表スキームことを持っている「は」を実行userテーブル

SELECT s.statusid, s.userid, s.statustype, s.subject, 
    s.datetime, c.commentid, c.statusid, c.userid, 
    c.comment, c.datetime, su.disp_name, 
    su.pic_url, cu.disp_name, cu.pic_url 
FROM teststatus AS s 
    LEFT JOIN teststatuscomments AS c 
     ON s.statusid = c.statusid 
    LEFT JOIN friend_reg_user AS su 
     ON su.auto_id = s.userid 
    LEFT JOIN friend_reg_user AS cu 
     ON cu.auto_id = c.userid -- EDIT 
WHERE s.userid =1OR s.userid 
     IN (2, 3, 4, 5, 6, 7, 8, 9, 
      10, 11, 12, 13, 14, 15, 
      16, 17, 18, 19, 20) 
ORDER BY s.statusid 
+0

これは、エントリーは私にコメントポスターの代わりにステータスポスターからのコメントの写真を与えている、私は今失われている – JasonDavis

+0

私はちょうどcu.auto_id = s.useridをON cu.auto_id = cに変更する必要があるかもしれないと思う.userid私はそれを試してみよう – JasonDavis

+0

おかげで、トリックは今、ありがとう!残念ながら、これは膨大な数の行を持つ膨大なDB上で実行される大きなクエリですので、必要なだけ速くはなく、適切なインデックスであっても、これを行う別の方法があるのだろうかと思います。 – JasonDavis

関連する問題