Effectuer des requêtes plus rapides avec count()

Eléphant du PHP | 130 Messages

18 avr. 2007, 10:10

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.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

18 avr. 2007, 11:31

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.

Eléphant du PHP | 130 Messages

18 avr. 2007, 12:22

Je te remercie. Je vais regarder du côté d'EXPLAIN. :)