Effectuer des requêtes plus rapides avec count()

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Effectuer des requêtes plus rapides avec count()

par bravegars » 18 avr. 2007, 12:22

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

par Hubert Roksor » 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.

Effectuer des requêtes plus rapides avec count()

par bravegars » 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.