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 :

Optimisation de requete suite a probleme de depassement de ressources chez OVH [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Par défaut Optimisation de requete suite a probleme de depassement de ressources chez OVH
    Bonjour à tous,

    J'ai développé depuis des années un petit CRM qui gère des contacts, au fur et à mesure de connaissances glanées et comprises sur divers forums.

    Evidemment PHP 5.6 est obsolète et je dois comprendre PHP 7.2 car OVH me dit que j'ai des dépassement de ressources avec les requêtes PHP.

    Or j'ai le sentiment que le pont est infranchissable tant je ne comprends pas le système de classe opposé aux requêtes écrites directement en php 5.6 et mysql 5.6.

    D'abord comme je code encore en mysql, on me dit de passer en PDO , ce qui est deja une epreuve quand on est pas un developpeur de base, ensuite il me faut passer aux classes de php 7.2.

    Je voudrai comprendre avec juste un exemple de code, des fois que je puisse comprendre par assimilation :

    Aujourd'hui quand je veux lire plusieurs tables jointes a partir d'un ID commun, j'ecris ce code mais le probleme est que meme si je selectionne les 30 nom de champs avant mon FROM, la requete est hyper lente :

    L'ensemble des 3 tables represente plus de 600 champs et plus de 30000 lignes insérées.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
     
    	$phrase_0 ="FROM `".$sufftable."table_1` D, `".$sufftable."table_2` G, `".$sufftable."table_3` U where ;
     
            $phrase_1 = "SELECT D.champA , D.champB , G.champD, U.champE $phrase_0";  // en réalité il y a 30 champs sur 600 qui sont indiqués car je n'ai besoin que de ces 30 la.
     
    	$phrase_2 = "SELECT SUM(D.champA ) as com $phrase_0";
            $phrase_3 = "SELECT SUM(D.champB ) as com $phrase_0";
     
    	$phrase_1_1='';
    	$phrase_2_2='';
    	$phrase_3_3='';
     
     
    	if ($searchstatut=="nouveau")
    	{
    		if ($c_annee<>""){$date_liste =" and (D.etude_A='$c_annee' or D.suivi_A='$c_annee')";}  else {$date_liste =" and (D.date>'$time_c_jour' or D.datemodif>'$time_c_jour')";}
    		$phrase_1_1 .= " and D.suivi='' and D.etude=''";
    		$phrase_2_2 .= $phrase_1_1;
    		$phrase_3_3 .= $phrase_1_1;
    	}
     
    	$phrase0 = " D.idCT=G.idCT and G.idGEST=U.idUT";
     
            $toto = $phrase_1.$phrase0.$date_liste.$secureclient;	
    	$phrase_1 = $phrase_1.$phrase0.$phrase_1_1.$date_liste;	
     
    	$resultat = mysql_query("$phrase_1 group by D.idCLIENT order by D.idCLIENT desc");
     
    	$nbresultat =mysql_num_rows($resultat);
    	$phrase_2 = $phrase_2.$phrase0.$phrase_2_2.$date_liste.$secureclient;
    	$phrase_3 = $phrase_3.$phrase0.$phrase_3_3.$date_liste.$secureclient;
     
    	$res = mysql_query("$phrase_1 group by D.idCLIENT order by D.idCLIENT desc");
    	$res_2 = mysql_query("$phrase_2 order by D.idCLIENT desc");
    	$res_3 = mysql_query("$phrase_3 order by D.idCLIENT desc");
     
     
    	$totchampA = mysql_result($res_2, 0, 'com'); $totchampA = number_format($totchampA , 2, ',', ' '); 
    	$totchampB = mysql_result($res_3, 0, 'com'); $totchampB = number_format($totchampB , 2, ',', ' '); 
     
    	$nbmaxres =mysql_num_rows($res);
     
     
    	/// le header de mon tableau
     
     
    	while($cl = mysql_fetch_array($res, MYSQL_ASSOC))
    	{
    		$idCT =$cl['idCT'];
    		$idGEST=$cl['idGEST'];                /// .....
                    ///  echo 'mes resultats';
     
                   $res_journal = mysql_query("SELECT * FROM `".$sufftable."journal` where idCT='$idCT  ' and ip='$ip'");
    	       $nb_journal =mysql_num_rows($res_journal );
                   if ($nb_journal =="0"){$modif=mysql_query("INSERT INTO `".$sufftable."journal` (`idCT`,`idGEST`,`date`,`ip`) VALUES ('$idcl','$idGEST','$auj','$ip')");}
                   else {$modif = mysql_query("UPDATE `".$sufftable."journal` SET `date` = '$auj' WHERE `idCT` = '$idCT' and `ip`='$ip' ");
            }
    Merci pour toute votre aide et explcations.

    Trés bon dimanche
    Guillaume

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$phrase_0 ="FROM `".$sufftable."table_1` D, `".$sufftable."table_2` G, `".$sufftable."table_3` U where ;
    1- Il manque un " avant le ; (mais je suppose que c'est juste un oubli)

    2- PLUS GRAVE : mauvaise syntaxe !
    Il faut faire des JOINTURES.

    Ex. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $phrase_0 = " FROM table_1 D
       INNER JOIN table_2 G
          ON D..... = G.....
       INNER JOIN table_3 U
          ON D..... = U.....
      WHERE ";
    A toi de savoir sur quelles colonnes faire les jointures.
    Si je suppose aussi que c'est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D.idCT=G.idCT and G.idGEST=U.idUT
    Alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $phrase_0 = " FROM table_1 D
       INNER JOIN table_2 G
          ON D.idCT=G.idCT
       INNER JOIN table_3 U
          ON G.idGEST=U.idUT
      WHERE ";
    3- AFFICHE ta/tes requêtes : pour vérifier ce qu'elles contiennent.

    Et tes $phrase_1, $phrase_2, $phrase_1_1,...... : c'est ILLISIBLES !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            $toto = $phrase_1.$phrase0.$date_liste.$secureclient;	
    	$phrase_1 = $phrase_1.$phrase0.$phrase_1_1.$date_liste;
    Et bonjour la galère pour la maintenance !

    4- Enfin, passe à PDO rapidement.
    Ce n'est pas la 1ère fois qu'on te le dit, et ça ne sert à rien de repousser l'échéance.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Par défaut
    Bonjour jreaux62 et merci pour ton intervention,

    Concernant PDO c'est justement ma question, je ne comprends pas si PDO est ce que c'est justement du PHP 7 ou aucun rapport.

    Et comment transcrire mon code en PDO, c'était ma question en fait.

  4. #4
    Invité
    Invité(e)
    Par défaut
    • mysql_ a été SUPPRIMÉ de PHP7.
    • PDO existe DEPUIS PHP 5.1 !


    Il faut utiliser PDO *:


    Là, il va falloir mettre TON code de coté, pour faire des EXERCICES (simples), afin de BIEN COMPRENDRE LA SYNTAXE PDO.
    Notamment, la notion de requête préparée.
    Ensuite, ce sera du gâteau.


    * J'aurais pu te parler de mysqli_, mais ce ne serait pas te rendre service (c'est très fastidieux, surtout pour les requêtes préparées), et PDO est le standard à connaitre.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Par défaut
    Je pense que tu as raison il faut que je mette de coté mon taf actuel pour passer a PDO définitivement, je vais aller sur des sites comme codeur.fr ou autre (peut etre y a t-il un forum ici) pour demander des devis ç des freelance pour mes devs préssés en php 7.2(PDO), comme ça au lieu de comprendre ce que les autres font et tenter de les démultiplier, je vais profiter du temps libre dégagé pour réapprendre à la base.

    Merci

  6. #6
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Moi je crois que tu devrais commencer par te poser des questions sur ton SQL...
    PDO, on verra après, c'est de la rigolade.

    Fais un echo SQL de ton "bazar" si je puis me permettre.
    Et fais-le tourner dans le PHPmyAdmin de OVH.
    Est-ce que ça prend un temps fou fou fou ?
    Si c'est le cas, ajoute un limit 10; qu'on puisse voir au moins ce que tu fais tourner comme requête.
    tu parles de 600 champs et 30 000 tuples, OK... c'est beaucoup. Ce qui m'étonne, ce ne sont pas tant les 30 000 tuples que les... 600 champs. Etonnant, ça, une table de 600 champs.
    Je crains fort qu'il y ait une lacune de modélisation.

    Peux-tu nous montrer ce "echo $sql" ?

    Thanks...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Invité
    Invité(e)
    Par défaut
    @Dendrite,

    1- Je te laisse gérer le SQL : c'est ton domaine.

    2- Quant au PDO, ben... aussi, puisque tu as écrit "PDO une soupe et au lit !"

    Citation Envoyé par jreaux62 Voir le message
    3- Concernant les astuces d'écriture (clause WHERE/AND,...), on verra plus tard, quand le SQL sera structuré.

  8. #8
    Invité
    Invité(e)
    Par défaut
    J'en reviens à ce que j'ai conseillé tantôt :

    Citation Envoyé par jreaux62 Voir le message
    il va falloir mettre TON code de coté, pour faire des EXERCICES (simples), afin de BIEN COMPRENDRE LA SYNTAXE PDO.
    Notamment, la notion de requête préparée.
    J'ajoute qu'il faut que tu te DOCUMENTES sur la BONNE UTILISATION / CONFIGURATION / SYNTAXE des tables et requêtes SQL :
    • JOINTURE, différence entre INNER JOIN et LEFT JOIN,...
    • PRIMARY / FOREIGN KEY
    • colonnes indexées



    Quand tu en sauras plus (par une RECHERCHE PERSONNELLE), tu comprendras mieux les conseils qu'on te donne.

  9. #9
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Côté modélisation, il est clair qu'il y a tout à revoir...

    On est au coeur de ta problématique. Je te donne juste un exemple pour que tu comprennes que tu ne peux pas laisser ta non-modélisation actuelle :

    Dans ta table demandeur, te voilà à nous parler de... dossiers...

    Es-tu bien sûr qu'un demandeur ne peut pas avoir plusieurs dossiers au cours de sa vie ?
    Si oui, on parle bien de personnnes surendettées qui peuvent revenir plusieurs fois vers vous, ne serait-ce pas plus sage d'avoir

    table demandeur (id, civ, nom, prenom, date_naissance, pays_naissance, ville_naissance) //des trucs qui ne bougent pas trop souvent globalement donc pas de dates associées

    Clé d'unicité ? dans un monde idéal et si tu as le droit de le stocker... le numéro de sécu que tu mettrais après l'id auto increment... sinon, les 6 derniers champs
    mais tu auras des problèmes de doublon, surtout avec des étrangers qui se nommeraient "chen li" nés à Pékin un 01/01/1970, parce que l'émigration a mis une date de naissance au pif...

    Après je suppose que tu t'intéresses à la situation du foyer, qui peut aller de 1 (le demandeur, à n)
    Mettons que le champ relation (avec le demandeur) soit un enum du type ('demandeur', 'conjoint', 'enfant', 'parent', 'autre')
    D'où tu tiens qu'on n'a jamais vu une personne avoir plus de dix enfants ? Mon beau-père en a 14 !!!
    Donc bien entendu qu'il faut procéder "dans l'autre sens"...
    Les novices en modélisation ont tendance à tout vouloir mettre sur un seul plan immédiatement compréhensible.
    Avec des floppées de colonnes... or, non, c'est une requête bien construite qui renvoie les colonnes bien jointes.

    table foyer (id, demandeur_id, relation, civ, nom, prenom, naissance, debut, fin)//ah vi, un foyer, c'est vivant, les gens entrent et sortent. Pour toutes ces histoires de date, de bornage, il y a plusieurs politiques.
    Mode facile : tu mets par défaut la fin à l'an 3000... avec un peu de chance, on sera tous morts, mais ça te permet de requêter directement avec des filtres comme "where curdate() between debut and fin"
    Mode puriste : tu mets par défaut la fin à null... ce qui fait que toutes tes requêtes ont pour filtre temporel "where (fin is null or curdate() between debut and fin)"... plus lourd, mais plus juste.

    Ensuite tu t'intéresseras aux revenus du foyer avec un truc du genre

    table revenu(id, foyer_id, libelle, montant, debut, fin)//mettons les adultes du foyer et leur revenu mensuel (là aussi, évolutions constnates, donc bornage des dates)

    idem pour les charges

    table charge(id, foyer_id, libelle, montant, debut, fin)//mettons les adultes et les enfants du foyer et leurs charges mensuelles (évolutions possibles, fin de crédit etc.)

    etc. etc.

    On te laisse déjà étudier tout ça... Une application de gestion budgétaire est un excellent exercice pour comprendre les grands concepts de la modélisation.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Par défaut
    Merci a tous les deux pour votre aide précieuse

    jreaux62 .. je vais m'atteler a tout regarder d'abord concernant le code PHP et effectivement je regarderai après l'optimisation.


    Celira : ... je ne savais si la suite du code avait une importance puisque seulement la récupération de valeur, mais voici le code :


    Merci encore pour tous vos conseils

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Côté modélisation, il est clair qu'il y a tout à revoir...
    ...

    AIEEEEE!! tu ne sais pas a quel point tu souleves un probleme connu. Il m'a été demandé au moins une centaine de fois de pouvoir creer autant de dossier différents par personne, et comme je n'ai jamais eu le temps car j'ai une autre activité, je n'ai rien trouvé de mieux que de proposer de dupliqué une ligne client en 'NOMCLIENT_2' et donc un autre ID pour le meme client, ce qui m'a posé d'inombrables problemes comme par exemple le stockage de documents que je fais sur un disque dur dont l'url contient un hash sur la base de certaines informations du clients ...... qui sont evidemment les memes quand je duplique..;

    Bref je sais que je dois tout reprendre, mais a la base ce logiciel n'avait pas une grande ambition et le voila utilisé (gratuitement) a plus de 20 agences qui sont toutes liées à l'association ....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  2. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26
  3. [C#] Requête MS Access (Problème avec Date)
    Par Erakis dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/02/2005, 22h54
  4. Optimisation de requete
    Par cyril dans le forum SQL
    Réponses: 3
    Dernier message: 09/10/2003, 08h57
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

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