2010-07-27 4 views
1

PHPque l'on est plus rapide/plus intelligent et pourquoi: COUNT (*) ou stocker les numéros chacun le faire quelque chose

$total_points = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM account WHERE id='$id'"),0) 

table compte Mysql

|user_id| 

points de table MySQL

|id | user_id | points | 

ou

PHP

$total_points = mysql_query("SELECT points FROM account WHERE id='$id'"); 

table compte Mysql

|user_id| points | 

points de Mysql Table

|id | user_id | points | 
+0

parce que vous n'allez obtenir 0 ou 1 résultats d'une optimisation beaucoup mieux serait d'ajouter l'indexation et/ou uniques ... ALTER TABLE 'points' ADD UNIQUE ( 'id' )' –

+0

non, la requête retournera aux utilisateurs le point actuel sur le site.par exemple, ils nous montrent combien de points nous avons, comme moi j'ai juste 20 points - ce qui signifie que j'ai fait quelque chose, et que quelque chose est enregistré dans un tableau et des points pour chaque chose donnée. le total des points comptés en additionnant tous les points individuels. donc ma question est dois-je utiliser la méthode COUNT (user_id) ou la méthode de la variable de stockage? – kornesh

Répondre

3

Le stockage de la variable serait probablement plus rapide, mais cela signifie aussi la mise à jour en permanence, ce qui peut être moins efficace/plus lent à long terme. Cependant, l'utilisation de COUNT(id) sera beaucoup mieux que COUNT(*). Donc, mon vote serait d'utiliser COUNT(id) :)

+0

Si je travaille sur un système de points joueur, où un utilisateur gagne des points en jouant à des jeux, les points seront enregistrés sur la table des points. et je pense à montrer les utilisateurs pointant à côté de leur nom d'utilisateur sur tout le site/ou au moins sur sa page de profil. Je ne comprends pas, pourquoi dites-vous qu'il sera plus lent/moins efficace à long terme? vous pensez quelle méthode utilise les portails populaires tels que NewGround/Kongregate pour montrer les points utilisateurs? Utilisent-ils la méthode de stockage en tant que variable, ou le COUND dynamique (id)? Si COUND (id) ils devraient faire face à beaucoup de problèmes de performance, ils ne le font pas? – kornesh

+0

'COUNT (id)' n'est pas plus rapide que 'COUNT (*)'. Sauf si vous utilisez une sorte d'agrégation, ces deux sont sémantiquement synonymes. –

0

Tout d'abord, pour la première ligne que vous aviez, je crois qu'il est plus rapide d'utiliser FOUND_ROWS() que COUNT(*).

$total_points = mysql_num_rows(mysql_query("SELECT FOUND_ROWS() FROM account WHERE id='$id'"),0) 

La deuxième approche serait plus rapide une fois que la table de points grossit, mais vous devez vous assurer que vous incrémenter la table de compte proprement ces valeurs sont synchronisés. Il peut devenir inexact si vous oubliez d'ajouter des points à certains endroits, ou oubliez de les supprimer, etc.

+0

exactement, lorsque la table de points grandir FOUND_ROWS méthode sera plus lent. Alors est-il préférable de faire FOUND_ROWS à chaque fois que vous obtenez le nombre total de points gagnés par l'utilisateur? ou les calculer et les enregistrer dans la table des comptes avec une colonne 'points' supplémentaire et charger les points à partir de là? et aussi créer un php dans le panneau d'administration pour mettre à jour la colonne des points des comptes souvent? quelle serait la meilleure solution? – kornesh

0

La version COUNT(*) ou la version de requête devrait être plus rapide car vous n'irez pas plus loin à mysql_num_rows. Pour compter vous n'avez pas besoin de tous les champs (*), vous devriez simplement faire COUNT(fieldID) ce qui est beaucoup plus rapide.

Quelques points à noter:

Notez que vous obtenez une seule ligne de toute façon parce que vous utilisez la clause where, autrement dit, le résultat sera soit une ligne ou pas de ligne si introuvable:

$total_points = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM account WHERE id='$id'"),0) 

Normalement, vous devriez compter lorsque vous attendez plus d'un enregistrement par exemple:

$total_points = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM account"),0) 

Encore une fois, pour la requête optimisée, utilisez un seul champ:

$total_points = mysql_result(mysql_query("SELECT COUNT(fieldID) as Num FROM account"),0) 
+0

Alors, quel serait le meilleur choix? stocker la variable dans la table des comptes utilisateurs ou récupérer dynamiquement les points via COUND (id)? – kornesh

Questions connexes