2011-08-30 1 views
2

Je n'arrive pas à trouver beaucoup d'informations à ce sujet.SQL COUNT (col) vs colonne de journalisation supplémentaire ... efficacité?

J'ai une table pour enregistrer les commentaires des utilisateurs. J'ai une autre table pour enregistrer les goûts/dégoûts des autres utilisateurs pour chaque commentaire. Par conséquent, lors de la sélection de ces données à afficher sur une page Web, il existe une requête complexe nécessitant des jointures et des sous-requêtes pour compter tous les likes/n'affets. Mon exemple est une personne de requête gentiment m'a aidé ici pour obtenir les résultats requis:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
    (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=1)likes, 
    (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=0)dislikes, 
    comment_likers.liker 
FROM comments 
INNER JOIN usrs ON (comments.usr_id = usrs.usr_id) 
LEFT JOIN comment_likers ON (comments.comment_id = comment_likers.comment_id 
    AND comment_likers.usr_id = $usrID) 
WHERE comments.topic_id=$tpcID 
ORDER BY comments.created DESC; 

Cependant, si j'ajouté un goûts et dégoûts colonne à la table des commentaires et créé un déclencheur pour incrémenter automatiquement/décrément ces colonnes comme likes sont insérées/supprimées/mises à jour dans la table LIKER, alors l'instruction SELECT serait plus simple et plus efficace que maintenant. Je demande, est-il plus efficace d'avoir cette requête complexe avec les COUNTS ou d'avoir les colonnes et les déclencheurs supplémentaires?

Et pour généraliser, est-il plus efficace de COMPTER ou d'avoir une colonne supplémentaire pour le comptage lors d'une interrogation régulière?

+0

double possible [Pourquoi les gens enregistrent-ils le nombre de X dans la colonne de la nouvelle base de données?] (Http://stackoverflow.com/questions/6883352/why-do-people-saves-count-of-x-in-new-databases-column) –

+1

S'il vous plaît voir le doublon suggéré. Question très similaire - Il est beaucoup plus efficace de stocker les agrégats plutôt que de les recalculer sur chaque page vue. –

+0

Oui merci de m'avoir mis en relation, d'abord de vraies informations que j'ai pu lire sur le sujet. – Psyrus

Répondre

0

Votre requête est très inefficace. Vous pouvez facilement éliminer ces sous-requêtes, ce qui augmentera considérablement les performances:

Vos deux sous-requêtes peuvent être remplacées par un simple:

sum(liker) likes, 
sum(abs(liker - 1)) dislikes, 

Faire toute la requête suivante:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
    sum(liker) likes, 
    sum(abs(liker - 1)) dislikes, 
    comment_likers.liker 
FROM comments 
INNER JOIN usrs ON comments.usr_id = usrs.usr_id 
LEFT JOIN comment_likers ON comments.comment_id = comment_likers.comment_id 
    AND comment_likers.usr_id = $usrID 
WHERE comments.topic_id=$tpcID 
ORDER BY comments.created DESC; 
+0

Nous vous remercions de votre suggestion. Je ne suis pas intéressé par toutes les sous-requêtes, mais je ne vois pas d'autre moyen de récupérer toutes les données requises dans une seule requête. Malheureusement, votre suggestion ne fonctionne pas, mais vous ne réalisez peut-être pas mes besoins. J'ai effectivement obtenu de l'aide d'ici pour cette requête et le lien est ici qui vous montrera mes besoins: http://stackoverflow.com/questions/7225303/mysql-count-function-not-performing-as-i-would-like -in-multiple-join-query – Psyrus

Questions connexes