Page 1 sur 1

Effectuer des requêtes plus rapides avec count()

Posté : 18 avr. 2007, 10:10
par bravegars
Bonjour,

J'ai une table comme ceci :
id, nom, nbr, maxco, pseudo, specialites, passions, loisirs
Je voudrais compter le nombre de fois ou TOTO par exemple est présent.
Le type des tables est MyIsam. Ma requête sera t'elle plus rapide en faisant.
$sql = "SELECT count(*) FROM matable WHERE pseudo='TOTO'";
$resultat = mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br>'.mysql_error());
$total = mysql_fetch_row($resultat);
ou
$sql = "SELECT count(1) FROM matable WHERE pseudo='TOTO'";
$resultat = mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br>'.mysql_error());
$total = mysql_fetch_row($resultat);
ou
$sql = "SELECT count(id) FROM matable WHERE pseudo='TOTO'";
$resultat = mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br>'.mysql_error());
$total = mysql_fetch_row($resultat);
ou bien peut-on faire encore plus rapide ? merci bien.

Posté : 18 avr. 2007, 11:31
par Hubert Roksor
Si "id" est déclaré comme NOT NULL alors les trois requêtes sont identiques, sinon ce sera COUNT(*) parce que

Code : Tout sélectionner

COUNT(id)
...est l'équivalent de

Code : Tout sélectionner

COUNT(*) WHERE id NOT NULL
Je ne me rappelle plus à quoi correspond exactement COUNT(1), mais il doit être identique à l'un ou l'autre.

La requête la plus performante devrait donc être COUNT(*) à condition qu'il y ait un index sur "pseudo" sinon tu es bon pour un scan complet de la table :) Pour info, avec un index sur "pseudo" MySQL utilisera simplement les statistiques de l'index et ne lira pas vraiment les données de la table donc ça a plus ou moins la complexité d'un

Code : Tout sélectionner

SELECT total FROM pseudo_table WHERE col = 'pseudo'
...et peu importe si le total est 10 ou 10 000 les performances seront quasiment les mêmes.

Si tu t'intéresses aux performances de tes requêtes regarde du côté d'EXPLAIN. Spécial bonus pour EXPLAIN EXTENDED qui permet d'avoir une idée de la manière qu'une requête est interprétée.

Posté : 18 avr. 2007, 12:22
par bravegars
Je te remercie. Je vais regarder du côté d'EXPLAIN. :)