IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Faire travailler php ou mysql ?


Sujet :

PHP & Base de données

  1. #1
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut Faire travailler php ou mysql ?
    Bonjour,

    Il m'est venu une question :
    vaut-il mieux faire une grosse requete et l'analyser en php
    ou
    vaut-il mieux faire de multiples requetes

    j'ai donc mesuré le temps sur 1000 iterations de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $liste = array(0=>4, 1=>7, 2=>2, 3=>14);
     
    foreach ($liste as $value) {
    	$sql = 'SELECT nom FROM clients WHERE idx =' . $value;
    	$res = mysql_query($sql);
    	while ($data = mysql_fetch_array($res)) {
    		echo $data["nom"]
    	}
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach ($liste as $value) {
    $in_liste .= $value . ",";
    	}
     
    $in_liste = substr($in_liste,0,-1); // on retire la derniere virgule
     
    $sql = 'SELECT nom from clients WHERE idx IN (' . $in_liste . ')';
    $res = mysql_query($sql);
     
    while ($data = mysql_fetch_array($res)) {
    	echo $data['nom'];
    	}
    Le resultat est très nettement en faveur du cas 1 (interrogation multiples de la bdd) mais le point lent du cas 2 semble être tout betement la construction de la $in_liste ...

    Globalement quelle méthode utilisez-vous ?
    La méthode 1 donne un code beaucoup plus simpe mais provoque des interrogations repetées de la bdd.

    Est-ce que mon test est biaisé parce j'aurais mal construit mon cas 2 ?

    Merci pour vos reponses.

  2. #2
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Bonjour,

    pour ma part, les test ne sont pas significatifs en raison de la non complexité des requêtes ( avec les bons indexs, les deux peuvent presque être aussi rapide. ) , et comme tu l'as si bien remarqué, le temps perdu dans le deuxième cas provient à mon avis de la fabrication de la liste de valeurs.

    Pour ton teste 2, essaie d'utiliser les fonctions php faites pour la concaténation de tableaux. implode() est fait pour ca.


    D'une manière générale, une requête même volumineuse vaudra toujours mieux que 1000 petites. Dans les systèmes en production, les serveurs web et BDD sont le plus souvent situé sur des machines distinctes ce qui engendre du dialogue entre celles-ci. En n'effectuant qu'une seule requête, tu réduis déjà ce point. De plus, avec plein de requêtes, le serveur sera chargé pendant un plus grand laps de temps, sauf si la requête unique est vraiment lourde.

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Je répond sans hésitation qu'il vaut mieux faire travailler le SGBD plutôt que coder ce que le SGBD sais déjà très bien faire
    De plus, plus tu fait travailler le SGBD et moins tu travail toi (avec l'utilisation des contraintes, triggers et procédures stockées le travail du SGBD peut représenter un travail énorme.

  4. #4
    Membre actif Avatar de romain_ci
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par kazou Voir le message
    Je répond sans hésitation qu'il vaut mieux faire travailler le SGBD plutôt que coder ce que le SGBD sais déjà très bien faire
    De plus, plus tu fait travailler le SGBD et moins tu travail toi (avec l'utilisation des contraintes, triggers et procédures stockées le travail du SGBD peut représenter un travail énorme.
    Tu travail peut etre moin mais le jour ou il y a 4000 ligne en BDD la ton appli va un peu galerer....

    Il vaut mieu travailler avec PHP et separer tes requetes, sans l'ombre d'un doute !

  5. #5
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Citation Envoyé par romain_ci Voir le message
    Tu travail peut être moins mais le jour ou il y a 4000 ligne en BDD la ton appli va un peu galerer....

    Il vaut mieux travailler avec PHP et séparer tes requêtes, sans l'ombre d'un doute !
    Là je suis pas d'accord, et j'attends avec impatience tes explications. ( 4000 lignes renvoyées ou dans la table ? )

    Le point bloquant est presque toujours la bdd c'est vrai, mais ce n'est pas en la noyant sous les requêtes que cela va la sauver.

    Le moteur de base de données s'est de lui même faire beaucoup d'optimisation que tu ne feras pas dans ton code php.
    Ensuite, les index pourront permettre d'optimiser encore plus les requêtes, il faut juste surveiller que le moteur les utilise.

    Plus vite tu auras récupérer les datas dans ton php, plus vite ton serveur bdd sera dispo pour la requête d'un autre utilisateur.

  6. #6
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    D'accord avec toi FCYPBA, il ne faut pas oublier que les SGBD ont pour travail de gerer des données ainsi que d'optimiser leurs acces, alors il le fera toujours mieu qu'un programmeur.
    Le programmeur à pour role de relier les données à un IHM et de demander le plus d'informations a la fois au sgbd pour lui eviter plusieurs traitement de requetes.

    Ensuite 4000 lignes pour un sgbd c'est absolument rien. tu exporte tout ca en moins d'une demi seconde ... en revenche je veux bien chronometrer la vitesse de ton algorythme pour le traitement du meme nombre de donnée.
    Ne pas oublier que le modèle merisien (référence en terme de base de donnée relationelle) préconise de séparer au maximum les données, ceci implique pas mal de tables servant seulement a lier des tables, et comportent souvent beaucoup d'occurences composé en majorité d'identifiant. Il y a beaucoup d'occurence non porteuse de donnée, mais indispensable a une bonne organisation des données.
    La vitesse d'une base de donnée ne depend pas toujours (et meme rarement) de sa taille mais de son organisation (indexation, structure des tables, etc ...)

    Pour finir en matière de resource système, souvent (dans l'hebergement web) le sgbd et apache sont sur la meme machine, alors si tu prend pas en compte que le sgbd travaille mieu que toi, sache que si ta machine effectu moins de calculs pour le sgbd, elle en dépensera plus pour ton apache ...

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par FCYPBA Voir le message
    Bonjour,

    pour ma part, les test ne sont pas significatifs en raison de la non complexité des requêtes ( avec les bons indexs, les deux peuvent presque être aussi rapide. )
    Je ne crois pas : un WHERE id = ... sera quasiment toujours plus performant qu'un WHERE id IN ...

    D'une manière générale, une requête même volumineuse vaudra toujours mieux que 1000 petites.
    Ca dépend trop des indexes et des jointures éventuelles entre tables pour pouvoir faire une généralité.

    Dans les systèmes en production, les serveurs web et BDD sont le plus souvent situé sur des machines distinctes ce qui engendre du dialogue entre celles-ci. En n'effectuant qu'une seule requête, tu réduis déjà ce point. De plus, avec plein de requêtes, le serveur sera chargé pendant un plus grand laps de temps,
    La grosse requête peut aussi exploser la RAM si elle est éxécutée par plusieurs visiteurs simultanément.

    sauf si la requête unique est vraiment lourde.
    bah oui...

    Tout ça pour dire que ce que tu dis est vrai, FCYPBA, mais je te trouvais juste un peu catégorique...

Discussions similaires

  1. [MySQL] classe php pour faire un update table mysql
    Par legrandse dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/05/2011, 15h52
  2. Faire tourner PHP (et MySQL) sur un serveur intranet
    Par laurentSc dans le forum Autres hébergeurs
    Réponses: 0
    Dernier message: 25/02/2011, 18h53
  3. [MySQL] Faire des pourcentages avec mysql et php
    Par rane dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 14/05/2010, 19h19
  4. [MySQL] Affichage d'un calendrier, faire travailler php ou mysql ?
    Par Neal Morse dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/04/2008, 16h28
  5. Travailler avec PHP / Apache / MySQL
    Par R3iTt0R dans le forum Linux
    Réponses: 22
    Dernier message: 24/06/2004, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo