Formation Google AnalyticsSavez-vous bien utiliser les outils de mesure d'audience ?
Effectuez-vous un calcul de ROI (Retour sur investissement) pour savoir comment améliorer vos campagnes emarketing ?
Savez-vous utiliser les bons outils pour booster votre taux de transformation ?
La formation Web Analytics de Ranking Metrics, présentée par un expert reconnu officiellement par Google Analytics, vous apportera les réponses à toutes vos questions !
===> Informations et inscriptions.

[PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Aller à la page 1, 2  Suivante
Poster un nouveau sujet Imprimer cette discussion    Forum -> Développement d'un site Web   Les dernières discussions de ce forum sont disponibles au format RSS
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 
SuperPJ
WRInaute passionné
WRInaute passionné

Inscrit le: 15 Jan 2005
Messages: 513
Localisation: Paris, France

URL permanente de ce messagePosté le : Dim Oct 30, 2005 18:14    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Quel est selon vous le plus rapide pour compter les rangées entre :

Code:
$sql = "SELECT COUNT(*) AS count FROM table ";
$res = mysql_query( $sql );
$val = mysql_fetch_array( $res, MYSQL_ASSOC );
$colonnes = $val['count'];
ou :
Code:
$sql = "SELECT * FROM table";
$res = mysql_query( $sql );
$colonnes = mysql_num_rows($res);


Merci Wink
 
SuperPJ Visiter le site web du posteur
spidetra
WRInaute accro
WRInaute accro

Inscrit le: 07 Juil 2003
Messages: 1499
Localisation: Toulouse

URL permanente de ce messagePosté le : Dim Oct 30, 2005 18:17    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

count(*)
 
SuperPJ Visiter le site web du posteur
SuperPJ
WRInaute passionné
WRInaute passionné

Inscrit le: 15 Jan 2005
Messages: 513
Localisation: Paris, France

URL permanente de ce messagePosté le : Dim Oct 30, 2005 18:22    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Merci chef Very Happy c'est aussi ce que je me disais Razz
 
SuperPJ Visiter le site web du posteur
spout
WRInaute passionné
WRInaute passionné

Inscrit le: 14 Mai 2003
Messages: 711
Localisation: Manhay (Belgique)

URL permanente de ce messagePosté le : Dim Oct 30, 2005 19:18    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

spidetra a écrit:
count(*)


Encore plus rapide (ou du moins plus propre):
COUNT(id)
 
spout
SuperPJ
WRInaute passionné
WRInaute passionné

Inscrit le: 15 Jan 2005
Messages: 513
Localisation: Paris, France

URL permanente de ce messagePosté le : Dim Oct 30, 2005 19:36    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Merci spoutnik Wink
 
SuperPJ Visiter le site web du posteur
tigrou
WRInaute discret
WRInaute discret

Inscrit le: 29 Fév 2004
Messages: 83
Localisation: Montpellier

URL permanente de ce messagePosté le : Dim Oct 30, 2005 21:51    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

tu peux même encore aller plus vite en te passant du mysql_fetch_array

Code:

$query   = "SELECT count(id) as compte from table";
$res = mysql_query($query);
$total = mysql_result($res, '0', 'compte');
 
tigrou Visiter le site web du posteur
STFprod
WRInaute passionné
WRInaute passionné

Inscrit le: 14 Jan 2004
Messages: 626
Localisation: Paris

URL permanente de ce messagePosté le : Dim Oct 30, 2005 23:23    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

spoutnik a écrit:
spidetra a écrit:
count(*)


Encore plus rapide (ou du moins plus propre):
COUNT(id)


ah non, c'est bel et bien count(*) qui est plus rapide. A quoi bon compter le nombre d'id, alors qu'on peut calculer le nombre de lignes ?
 
STFprod Visiter le site web du posteur
Digit
WRInaute passionné
WRInaute passionné

Inscrit le: 18 Avr 2003
Messages: 613
Localisation: La tête dans les logs

URL permanente de ce messagePosté le : Dim Oct 30, 2005 23:34    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

plus généralement, quel que soit le SGBD, count(1) est plus rapide que count(id)
 
Digit Visiter le site web du posteur
SuperPJ
WRInaute passionné
WRInaute passionné

Inscrit le: 15 Jan 2005
Messages: 513
Localisation: Paris, France

URL permanente de ce messagePosté le : Dim Oct 30, 2005 23:48    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Vous me confirmez que count(*) est plus rapide que count(id) ? Confused
Vous êtes bien tous d'accord là-dessus ? Spoutnik, reconnais-tu ton erreur? Wink
 
SuperPJ Visiter le site web du posteur
squawk
WRInaute accro
WRInaute accro

Inscrit le: 22 Mar 2004
Messages: 5985

URL permanente de ce messagePosté le : Lun Oct 31, 2005 0:18    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

sur à 100% Wink
 
squawk
Digit
WRInaute passionné
WRInaute passionné

Inscrit le: 18 Avr 2003
Messages: 613
Localisation: La tête dans les logs

URL permanente de ce messagePosté le : Lun Oct 31, 2005 1:53    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Je ne confirme pas.
S'il s'avère que la requête contient une clause where, il n'y a pas l'utilisation en interne de mysql de la zone de stockage de cette valeur (le moteur innodb réserve une petite zone de données dans les structures de tables pour y mémoriser le nb d'enregistrements) et la requete doit alors parcourir toutes les lignes (d'où un besoin d'index pour réduire le calcul)
J'ai précisé que count(1) est le plus rapide car aucune donnée de la table (aucune valeur de champs) n'est récupérée. un count(id) lirait toutes les valeurs du champs.
Le count(*) a de forte chances de lire tous les champs tandis que le count(1) n'en lira aucun, ce doit donc être théoriquement plus rapide
 
Digit Visiter le site web du posteur
spidetra
WRInaute accro
WRInaute accro

Inscrit le: 07 Juil 2003
Messages: 1499
Localisation: Toulouse

URL permanente de ce messagePosté le : Lun Oct 31, 2005 11:38    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Je suis surpris qu'un simple count(*) entraîne un tel débat.

La comparaison count(*)/count(id) en terme de performance me paraît aussi inutile que la comparaison double quote/simple quote en PHP.

Ce n'est pas là que vous devez fournir vos efforts pour améliorer significativement les performances de votre système. Les gains, s'ils existent, sont minimes et insignifiants.

S'il existe un écart entre count(*) et count(id), combien de fois faut-il exécuter la requête pour avoir un gain d'une seconde ?
Plusieurs dizaines de milliers de fois, centaines de milliers de fois ?

Par contre, cela me gêne un peu plus, non pas en terme de performance, mais en terme de compréhension de la foncion d'aggrégation count().

La fonction count a deux format :
- cardinalité
- expression

1. Cardinalité : La cardinalité d'une table, c'est son nombre de ligne.
L'opérateur cardinalité de la fonction count est : *
Donc pour compter le nombre de ligne d'une table, sa cardinalité, la bonne forme est toujours : count(*).
Si on remplace count(*) par count(id), dans la mesure où id est la clé primaire. Nous obtenons exactement le même résultat. A tel point, que si le moteur sql est bien implémenté, il effectue automatiquement un count(*) à la place d'un count(id).

Le * du count(*), n'as pas la même signification que le * du select *.
Donc, non, quand on fait un count(*), on ne récupére pas tout les champs de la table. On dit juste au moteur SQL : renvoie moi la cardinalité de la table.


2. Compter une expression : count([ALL|DISTINCT] expression)
Lorsque l'on compte une expression on compte toutes les valeurs connues de l'expression.
Ce qui veut dire :
- les nulls ont été éliminé avant le comptage, et count renvoie 0 si aucune ligne n'a été trouvée.
- count(DISTINCT expression ) : les nulls ont été supprimmé avant comptage, et la table a été dédoublonné.

Evidemment, lorsque l'on fait un count(id), id étant la clé primaire, on obtient exactement le même résultat que pour un count(*).
- une clé primaire n'accepte pas la valeur null
- une clé primaire pas de doublons.

Il n'est pas plus propre, ou moins propre, d'utiliser count(id) à la place de count(*)) => on ne compte pas la même chose.

Conclusion :
- chaque fois que tu veux calculer une cardinalité ( nbr de ligne ) : utilise count(*)
- chaque fois que tu veux compter une expression : utilise count(expression).

Tout ça pour en revenir à ma première réponse laconique :

count(*)
 
Digit Visiter le site web du posteur
STFprod
WRInaute passionné
WRInaute passionné

Inscrit le: 14 Jan 2004
Messages: 626
Localisation: Paris

URL permanente de ce messagePosté le : Lun Oct 31, 2005 11:45    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

spidetra a écrit:
Je suis surpris qu'un simple count(*) entraîne un tel débat.

La comparaison count(*)/count(id) en terme de performance me paraît aussi inutile que la comparaison double quote/simple quote en PHP.

Tu t'insurges sur le fait qu'un tel débat soit stérile et fait pour départager 2 méthodes, et c'est toi qui nous fait une dissertation surle principe de base de données, pour terminer par : c'est count(*)...

Finalement, c'est ce qu'on a dit depuis le début Smile
 
STFprod Visiter le site web du posteur
mowmow
WRInaute passionné
WRInaute passionné

Inscrit le: 03 Nov 2004
Messages: 969
Localisation: Zend Engine

URL permanente de ce messagePosté le : Lun Oct 31, 2005 11:45    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

Faites des bench Smile

Je propose ca :

$sql = mysql_query('SELECT 1 FROM table');
$count = mysql_num_rows($sql);

Il faudrait tester tout ca Very Happy
 
mowmow Visiter le site web du posteur
mowmow
WRInaute passionné
WRInaute passionné

Inscrit le: 03 Nov 2004
Messages: 969
Localisation: Zend Engine

URL permanente de ce messagePosté le : Lun Oct 31, 2005 11:49    Sujet du message: [PHP/SQL] Quel est le plus rapide pour compter les rangées ?

spidetra a écrit:

La comparaison count(*)/count(id) en terme de performance me paraît aussi inutile que la comparaison double quote/simple quote en PHP.


Il n'y a aucun débat à faire sur les double/simple quotes, il a été prouvé que les simple quotes sont plus rapides :

http://www.estvideo.com/dew/pages/phpbench/
 
mowmow Visiter le site web du posteur
 
Montrer les messages depuis:   
Revenir en haut    Forum -> Développement d'un site Web Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 2 - Aller à la page 1, 2  Suivante
Connexion
Nom d'utilisateur:    Mot de passe:      Se connecter automatiquement à chaque visite    

CLIQUEZ ICI pour vous inscrire à WebRankInfo (forum, annuaire, outils...)

Connexion

© 2001-2005 phpBB Group, support français
Personnalisation : WebRankInfo ™


 ODP  Firefox  Alsacreations  annuaire webmaster Yagoort