Différence entre ...

Discussion dans 'Web, design' créé par SkYlEsS, 24 Avril 2007.

Statut de la discussion:
Fermée.
  1. Offline
    SkYlEsS Kawai
    Code:
    $req = mysql_query("SELECT COUNT(*) AS nbr FROM table WHERE champ = '$variable'");
    $res = mysql_fetch_array($req);
    $nbr = $res['nbr'];
    et

    Code:
    $req = mysql_query("SELECT * FROM table WHERE champ = '$variable'");
    $res = mysql_num_rows($req);
    :?:

    Ces deux requêtes donnent le même résultat, mais laquelle est mieux que l'autre ?
    SkYlEsS, 24 Avril 2007
    #1
  2. Offline
    zoheir cvm.mangaleet()
    Le count évidemment, le select * récupère des données inutilement :pfiou:
    zoheir, 24 Avril 2007
    #2
  3. Offline
    SkYlEsS Kawai
    oki, sauf si j'ai besoin des éléments récupérés par après. Dans ce cas, je ferai d'une requête deux variables :-D
    SkYlEsS, 24 Avril 2007
    #3
  4. Offline
    Ezekiel ! Elite
    Je pense que tu peux même remplacer ton * par l'id de ta table pour gagner en performance.
    Si qqun peut confirmer :)
    Ezekiel !, 25 Avril 2007
    #4
  5. Offline
    SkYlEsS Kawai
    Confirmé ;)
    SkYlEsS, 25 Avril 2007
    #5
  6. Offline
    Calvin80 Elite
  7. Offline
    Shrekju ex membre
    Non, cela fera une projection en plus. Sans rentrer dans les détail, le moteur sql commence par prendre tous les champs en mémoire pour traiter le WHERE. Ensuite il va regarder le SELECT pour voir ce qu'il faut garder.
    Shrekju, 26 Avril 2007
    #7
  8. Offline
    SkYlEsS Kawai
    Autant pour moi, j'avais mal lu : je croyais qu'il parlait de l'id d'un champ de la table :roll:
    SkYlEsS, 26 Avril 2007
    #8
  9. Offline
    La Poubelle Elite
    Comme l'a dit Calvin il ne faut JAMAIS utiliser *, qu'importe la requete.

    Avec un peu de bon sens, la méthode la plus économique

    1) Effectuer une requête TRAITER par MySql qui renverra UNE réponse au serveur PHP. Commande SQL standard optimiser, qui plus est.
    2) MySql renvoyant la totalité des ligne au serveur PHP, puis le serveur ayant récupéré l'ensemble des données stockées sous forme de tableau qui va utiliser une fonctionnalité PHP pour compter


    Autant d'un point de vue mémoire ou de traitement, la réponse me semble inutile.
    La Poubelle, 26 Avril 2007
    #9
  10. Offline
    Tifox ou pas
    C'est en fait le contraire qu'il dit : un count(*) est toujours plus rapide qu'un count(nom_d'un_champ). Maintenant dans le cas d'une requete select normale (ou on veut des lignes de la DB, et pas le nombre de ligne), il est effectivement préférable de récupérer juste les champs dont on a besoin plutot que tous (*), pour limiter le nombre de données transmises entre la DB et le serveur web. Mais même dans ce cas la, un "select * from ..." sera plus rapide qu'un "select champ1, champ2 from ...".
    Tifox, 26 Avril 2007
    #10
  11. Offline
    La Poubelle Elite
    Pas en SQLServer.

    Les procédures stockées sont optimisées.
    La Poubelle, 26 Avril 2007
    #11
  12. Offline
    Tifox ou pas
    Je ne suis pas ultra-familier des procédures stockées, mais je ne vois pas très bien ou il y a une procédure stockée dans un select.

    Note que ce n'est pas un reproche et que je peux certainement me tromper, j'aimerai juste en savoir plus la dessus.
    Tifox, 26 Avril 2007
    #12
  13. Offline
    Calvin80 Elite
    on ne parle pas du tout de procédure stockée là.
    Tifox a très bien résumé.
    un count(*) est en tout cas aussi rapide qu'un count(nom_champ)

    et un select a,b,c,d est en tout cas aussi rapide qu'un select *.
    Calvin80, 26 Avril 2007
    #13
  14. Offline
    La Poubelle Elite
    Testé sur une BDD avec une centaine de champs et quelques millions de records ainsi que la charge du serveur avec le parcours dans un logiciel ?
    La Poubelle, 26 Avril 2007
    #14
  15. Offline
    Tifox ou pas
    Le premier lien de calvin fait un test sur une table avec 7 million de record, et les quelques recherches que j'ai faites tantot au boulot avait l'air de confirmer ça je ferai quelques test sur les BD du boulot demain pour voir.
    Tifox, 26 Avril 2007
    #15
  16. Offline
    Calvin80 Elite
    fait un explain d'un query, tu comprendras pkoi ça donne ce résulat ! :)
    Calvin80, 26 Avril 2007
    #16
  17. Offline
    La Poubelle Elite
    Comme tu peux le constater sur ton premier lien, son test est ralenti à cause de l'exclusion des valeurs null.

    Comme beaucoup, la fonction COUNT est utilisé avec l'ID est non avec un champ qui renverra des valeurs lourdes ou douteuses.


    Dans un select classique, Sur une BDD d'une cinquante de champ (bien chargé en string, pour faire court). Entre "SELECT * FROM TBL" et "SELECT ID, CHAMP1 from TBL". Il est impossible que le serveur n'en prenne pas un coup au niveau de la charge et de la mémoire.

    Ce n'est pas avec ce petit test à moitié fini qu'il faut faire une généralité sur les requêtes SQL avec *

    Il ne faut pas oublier que le résultat est renvoyer au logiciel pour seulement être traité.
    La Poubelle, 26 Avril 2007
    #17
  18. Offline
    Calvin80 Elite
    je ne te suis plus..
    on ne compare pas select count(*) et select *, on compare select count(*) et select count(champ) et , d'un autre coté, select * et select champ1, champ2 etc...

    temps_executiont(count *) <= temps_execution (count champ)
    et
    temps execution (select *) >= temps_execution (select champ1,champ2,...)
    Calvin80, 26 Avril 2007
    #18
  19. Offline
    SkYlEsS Kawai
    Heu non, on comparais mysql_num_rows à SELECT COUNT(*) d'abord ... :)

    Notons que l'on peut faire SELECT champ_1, champ_2 COUNT(champ_3) FROM table WHERE ... d'après ce j'ai lu =]
    SkYlEsS, 26 Avril 2007
    #19
  20. Offline
    Calvin80 Elite
    oui, mais tu vas devoir faire un group by. =]
    Calvin80, 26 Avril 2007
    #20
Statut de la discussion:
Fermée.