2009-08-08 9 views
1

Voici mon schéma de table mysql;Comment faire pour que mes requêtes mysql pour un ami se nourrissent d'une grande base de données?

  1. table d'état // a StatusID, userID, date, sujet, date
  2. table de commentaire // détient CommentID, ID utilisateur qui a posté, la date et StatusID qu'il appartient aussi
  3. table utilisateur// contient le nom d'utilisateur ID utilisateur et l'URL de la photo d'utilisateur

Avec ce schéma de table ci-dessus, j'ai besoin de faire ceci;

  1. rapide avec moins de DB interroge
  2. Afficher toutes les entrées d'état sur une page qui sont publiés par un utilisateur dans ma liste d'amis (peut-être jusqu'à 5.000 amis)
  3. Voir tous les commentaires pour chaque état entrée sous le blog approprié
  4. montrent un nom d'utilisateur/photo URL pour chaque poste
  5. d'entrée d'état montrent une URL nom d'utilisateur/photo pour toutes affiches commentaire suivant pour y commentaire

Le résultat que je suis après est similaire à myspace ou facebook où il montrera tous les messages/actions ou tout simplement de vos AMIS.

Vous pouvez même comparer CETTE page sur le débordement de pile à ce que j'essaye d'accomplir, considérer mon article comme un article de statut et toutes les réponses sur cette page seraient statut, puis dans toutes les réponses sur cette page, il montre des commentaires Sous chacun d'entre eux et ils ont tous des informations sur l'utilisateur, y a-t-il un meilleur moyen d'y parvenir sans autant de jointures et d'autres choses?

Question 1
Y at-il de toute façon mieux d'accomplir ce dont j'ai besoin? Ce n'est pas vraiment assez rapide quand il y a des millions de lignes qu'il recherche même avec des index, quelles sont mes options?

Question 2
Est-il possible de modifier cela pour montrer que le premier X ammount des commentaires sur chaque poste de statut? Et si oui, est-ce que cela accélérerait le processus puisqu'il n'aurait pas à faire autant de commentaires?

Ci-dessous la liste des amis est déjà dans la requête, la raison est que je prévois d'obtenir la liste d'amis dans un tableau et le stocker dans le cache Memcache ou APC de sorte qu'il sera 1 moins requête

Voici ma requête

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) Je vais commencer une prime sur ce dès qu'il me laisse

+0

-vous nantie d'avoir ce tableau schéma? –

+0

Parce que sinon, je suggérerais d'indexer vos relations utilisateur/ami à sa propre table. –

+0

Je ne suis pas vraiment suivi, les relations d'amis est sa propre table et la table des utilisateurs est la table principale avec des informations de compte, la table de relation d'ami est des millions de rangées longues parce qu'une utilisation peut avoir beaucoup d'amis – JasonDavis

Répondre

3

Votre jointure est basée sur le même champ étant égal à deux valeurs différentes, donc il ca nnot jamais être satisfait

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

Vous avez besoin de deux joint à la table utilisateur

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

entrée cependant il me donne la photo sur les commentaires de l'affiche de statut au lieu de l'affiche de commentaire, je suis tellement perdu maintenant – JasonDavis

+0

Je pense que je pourrais juste devoir changer sur CU.auto_id = s.userid sur ON cu.auto_id = c .userid im va essayer que – JasonDavis

+0

Ok super qui a fait le tour maintenant merci! Malheureusement, il s'agit d'une grosse requête exécutée sur une base de données énorme avec des millions de lignes, donc ce n'est pas aussi rapide que j'en ai besoin, même avec des index appropriés, je me demande s'il existe une autre façon de le faire? – JasonDavis

Questions connexes