2012-02-21 13 views
0

私のアプリでは、あなたのアップデートなどを入手するためにユーザーを購読することができます...しかし2000人の人にサブスクライブすると言うと、クエリはあまりにも大きくなるでしょう。これは、1000 +とより多くのサブスクリプションで動作することPHPのサブスクライバのSQLクエリが大きすぎますか?

SELECT * FROM updates WHERE uid='433154988124' || uid='643474995854' || 
    uid='841341889862' || uid='231955782795' || uid='763438359221' || 
    uid='232345661645' || uid='786313664389' || uid='311617571586' || 
    uid='895988518181' || uid='576877484624' || uid='119448961897' || 
    uid='963671595174' || uid='342987961447' || uid='259688255351' || 
    uid='746656932975' || uid='716846928846' ORDER BY date DESC LIMIT 0, 15 

は、だから何が私に語った:これは、15のユーザーのサブスクリプションと彼の自己を実行したクエリがある

行くための正しい方法は...あります?

別の方法で行ったり行ったりする方法は良いですか?

+0

これは正しい方法ではありません。サブスクリプションはどこに保存されていますか?結合された選択について考える必要があります。 – Marc

+0

別の方法では、IDを取得してSQLクエリ文字列に追加するのではなく、それらを参加させることです。 – fxuser

+1

はい、そうです。 Rick Hovingもそれを言いました。 – Marc

答えて

1

、次は

  1. を仮定しなければならないのuidフィールドは更新時にあなたが(UID、日付)として指定されたインデックスを持つINT
  2. です(uidがPKであれば、これを無視男性として

    SELECT * FROM updates 
    WHERE uid IN (
        433154988124, 
        643474995854, 
        841341889862, 
        231955782795, 
        763438359221, 
        232345661645, 
        786313664389, 
        311617571586, 
        895988518181, 
        576877484624, 
        119448961897, 
        963671595174, 
        342987961447, 
        259688255351, 
        746656932975, 
        716846928846, 
    ) ORDER BY date DESC LIMIT 0, 15 
    

    - とちょうど発注の日付インデックス)

悪いクエリを持っていますあなたがこのより良いクエリを実行できるように、リンクテーブルがより効果的な方法になります。

SELECT updates.* 
FROM updates 
INNER JOIN users_subscriptions 
ON users_subscriptions.uid = updates.uid 
ORDER BY updates.date DESC LIMIT 0, 15 
5

これは、1000以上の定期購読では非常に遅くなるでしょう。あなたがしたいことは、リンクテーブルのUserSubscriptionsまたはそのようなものを作成することです。そのテーブルには、ユーザーIDとそれが購読されているIDを格納することができます。あなたのクエリの中で、それらの2つのテーブルを結合することができます。

あなたの具体的な例
+0

絶対に良いアプローチ... – DRapp

関連する問題