C'est justement là que je ne suis pas d'accord : à aucun moment on a de GROUP BY avec la deuxième méthode... (au passage, on peut très bien faire un COUNT() avec mysql_query() d'ailleurs hein).Lorsque j'évoquais le GROUP BY, c'était pour comparer les stratégies suivantes dans le cas où l'on souhaite savoir combien il y a de tuples :
[...]
Nous sommes visiblement d'accord sur ce point : il est préférable d'éviter ce type de COUNT()
- mysql_query() puis mysql_num_rows()
- mysql_unbuffered_query() avec la même requête que ci-dessus incluant une colonne COUNT() et, par conséquent, un GROUP BY
Il y a une autre solution que tu as évoquée comme "ridicule" et j'adhère à ton avis sur ce point.
On a side note: je considère la seconde des méthodes ci-dessus comme étant tout aussi ridicule.
- Cas 1 (simplifié) : mysql_query( "select id from article where type = 'toto'" ); $nb = mysql_num_rows();
- Cas 2 (simplifié aussi) : mysql_query( "select count(*) from article where type = 'toto'" ); $nb = mysql_fetch_assoc();
=> Il n'y a aucun "group by" ici. De plus, le critère en question est même sûrement indexé, et donc MySQL n'ira même pas "compter les lignes" dans la table mais lira juste les infos dans l'index.
Je voulais dire par là qu'il évitait justement de faire un "SELECT de récupération des données" suivi d'un "SELECT de comptage". Et je répète que c'est pour moi le seul cas où mysql_num_rows() est utile.Merci pour la précision sur le fonctionnement de mysql_num_rows(), il correspond à ce que je soupçonnais.
J'avais supposé que tu lui attribuais un fonctionnement différent à cause de cette remarque :
Je me suis visiblement trompé. Que voulais-tu dire ?Envoyé par Kioob
peux tu préciser ta pensée stp ?j'utilise les guillemets car, techniquement, les tuples ne sont pas exactement retournés
Pour moi que l'appel soit fait via mysql_query() ou mysql_unbuffered_query() ne change pas grand chose coté serveur : le serveur lit les données sur le disque, et toutes les N lignes (suivant la taille de son tampon réseau) il envoit un paquet au client.Quelle est la différence avec une requête mise en buffer puis parcourue ?
Ce qui change c'est la façon dont le client gère la réception des paquets :
- cas mysql_unbuffered_query() : le socket est lu à chaque appel de mysql_fetch_assoc()
- cas mysql_query() : le socket est lu d'une traite par la fonction mysql_query(), et son contenu intégralement copié en mémoire. Chaque appel de mysql_fetch_assoc() va chercher les tuples en mémoire.
La seule différence notable d'après moi est la consommation mémoire sur le client.
Partager