SELECT COUNT vs MYSQL_NUM_ROWS

SELECT COUNT vs MYSQL_NUM_ROWS - PHP - Programmation

Marsh Posté le 30-03-2006 à 08:46:22    

Voila une petite question d'optimisation.
 
A votre avis que vaut il mieux utiliser et pourquoi ?
 
C'est pour récupérer différents avis
 
++


---------------
N'oubliez pas de mettre [RESOLU] dans le titre quand c'est fini - Pour poster vos sources : http://paste.clicksources.com/
Reply

Marsh Posté le 30-03-2006 à 08:46:22   

Reply

Marsh Posté le 30-03-2006 à 09:01:40    

d'après toi, que fais la command mysql_num_rows ?

Reply

Marsh Posté le 30-03-2006 à 09:09:50    

un count me parait bien plus intéressant :  
la requête va juste stocker en mémoire un entier alors que si tu fais une requête normale pour ensuite faire un mysql_num_rows, celle-ci va stocker inutilement tous les résultats en mémoire pour ensuite les compter en PHP avec mysq_num_rows ;)

Reply

Marsh Posté le 30-03-2006 à 09:19:25    

nero27 a écrit :

un count me parait bien plus intéressant :  
la requête va juste stocker en mémoire un entier alors que si tu fais une requête normale pour ensuite faire un mysql_num_rows, celle-ci va stocker inutilement tous les résultats en mémoire pour ensuite les compter en PHP avec mysq_num_rows ;)


je doute que ça se passe ainsi....

Reply

Marsh Posté le 30-03-2006 à 09:22:35    

mysql_num_rows fait un simple count(mysql_fetch_row($res)) :D
 
Donc oui, le count mysql est plus rapide, mais leprobleme, on ne peut récuperer qu'un compteur alors qu'avec la fonction php on traite directement le retour des lignes.
 
Bon d'un coté on peut tres bien faire, select count(*) as compteur, nom, prenom....


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 30-03-2006 à 09:25:30    

perso j'utilisais select count lorsque j'avais que ca à retirer, et si je récupère d'autres info j'utilisais le num_rows, mais c'est vrai que le select count(*) as compteur est pas mal non plus.


Message édité par newneo2001 le 30-03-2006 à 09:25:54

---------------
N'oubliez pas de mettre [RESOLU] dans le titre quand c'est fini - Pour poster vos sources : http://paste.clicksources.com/
Reply

Marsh Posté le 30-03-2006 à 09:43:42    

Evidemment, si on a aussi besoin des champs un mysql_num_rows($result) est plus approprié, mais vu comment la question est formulée, je parlais du cas où on n'a besoin que du compteur ;)

Reply

Marsh Posté le 30-03-2006 à 10:15:34    

nero27 a écrit :

Evidemment, si on a aussi besoin des champs un mysql_num_rows($result) est plus approprié, mais vu comment la question est formulée, je parlais du cas où on n'a besoin que du compteur ;)


 
Logique, en fait, select id from toto renvoi toute les lignes genre si il y a 1millions d'enregistrement, il va y avoir un retour d'un million d'enregistrement...
 
Alors que on peut faire ça si l'ont veut : select max(id) from toto (si autoincrement)qui renvera l'id meme si il y a une perte en cas de suppression de champ, donc un compteur approximatif, ça a le mérite d'etre ultra performant :)
 
donc plusieurs solution possible :)

Message cité 1 fois
Message édité par chaced le 30-03-2006 à 10:20:50

---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 30-03-2006 à 10:20:34    

Non, max(id) est loin d'être performant :/

Reply

Marsh Posté le 30-03-2006 à 10:21:06    

ça plutot alors :D select id from toto order by id desc limit 0,1
 
Perso, j'utilise plutot count(*) as cpt :lol:


Message édité par chaced le 30-03-2006 à 10:21:55

---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 30-03-2006 à 10:21:06   

Reply

Marsh Posté le 30-03-2006 à 10:30:22    

newneo2001 a écrit :

Voila une petite question d'optimisation.
 
A votre avis que vaut il mieux utiliser et pourquoi ?
 
C'est pour récupérer différents avis
 
++


 
Le select count sera bien plus economique en terme de memoire et de charge sgbd.
 
Par contre, en cas de pagination des résultats avec utilisation du LIMIT (comme ça arrive presque tout le temps), tu as l'option du SQL_CALC_FOUND_ROWS qui te permet de ramener le nombre total de lignes independamment des bornes du LIMIT, donc ça t'evite de faire un SELECT COUNT sans LIMIT juste pour connaitre ce total.
 

Reply

Marsh Posté le 30-03-2006 à 10:55:15    

Ca m'intéresse : tu peux développer un peu stp (avec un exemple si possible) ?


Message édité par nero27 le 30-03-2006 à 10:55:28
Reply

Marsh Posté le 30-03-2006 à 11:02:21    

Reply

Marsh Posté le 30-03-2006 à 11:17:44    

chaced a écrit :

Logique, en fait, select id from toto renvoi toute les lignes genre si il y a 1millions d'enregistrement, il va y avoir un retour d'un million d'enregistrement...
 
Alors que on peut faire ça si l'ont veut : select max(id) from toto (si autoincrement)qui renvera l'id meme si il y a une perte en cas de suppression de champ, donc un compteur approximatif, ça a le mérite d'etre ultra performant :)
 
donc plusieurs solution possible :)


 
euh grave pas optimisé, les tables MyISAM stockent directement le nombre d'enregistrements de la table, meme pas besoin de la parcourir (a considerer que tu veux tous les enregistrements)


Message édité par Djebel1 le 30-03-2006 à 11:21:22
Reply

Marsh Posté le 30-03-2006 à 12:42:34    


 
En français, y a 10 fois moins de commentaires d'utilisateurs  [:zytrafumay]  

Reply

Marsh Posté le 30-03-2006 à 13:06:16    

C'est normal si tout le monde va sur la version anglaise.... :D


---------------
CPU-Z | Timespy | Mes bd
Reply

Marsh Posté le 30-03-2006 à 22:05:02    

super intéressant ça  
 
SQL_CALC_FOUND_ROWS
 
je connaissais pas. Merci pour l'info


---------------
N'oubliez pas de mettre [RESOLU] dans le titre quand c'est fini - Pour poster vos sources : http://paste.clicksources.com/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed