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 :

Délais php - requete sql


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut Délais php - requete sql
    Bonjour,
    j'ai une bonne grosse requête et une bonne grosse table.
    j'essayes d'optimiser évidement tout cela.

    Ma requete:
    via phpmyadmin je mets 0.0003 sec
    pourtant via php je mets plus de 30 sec.

    Pourquoi?

    voici mon code de test
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "SELECT ana_liste.nom_action,ana_marge.suffixe,ana_marge.date_num,STR_TO_DATE(ana_marge.date_date,'%d/%m/%Y'),ana_marge.sens,ana_marge.marge,ana_marge.jrs_posit,ana_marge.ma_jrsp,ana_tende.dwphase_cac,ana_tende.dwprofil_cac,ana_tende.posbdfg_cac,ana_tende.posd200_cac,ana_tende.posd100_cac,ana_tende.posd050_cac,ana_tende.postdli_cac,ana_tende.poskal_cac,ana_tende.dwpente_cac,ana_tende.dwptcac_max,ana_tende.dwptcac_min,ana_tende.dwphase_act,ana_tende.dwprofil_act,ana_tende.posbdfg_act,ana_tende.posd200_act,ana_tende.posd100_act,ana_tende.posd050_act,ana_tende.postdli_act,ana_tende.poskal_act,ana_tende.dwpente_act,ana_tende.dwptact_max,ana_tende.dwptact_min,ana_tende.ifr_act,ana_tende.ifr_act_max,ana_tende.ifr_act_min FROM ana_marge INNER JOIN ana_liste ON ana_marge.suffixe = ana_liste.suffixe INNER JOIN ana_tende ON ana_marge.suffixe = ana_tende.suffixe AND ana_marge.date_num = ana_tende.date_num WHERE ana_marge.sens = 'ACH' AND ana_marge.ref_cfg = '' AND SUBSTR(ana_marge.cas,1,1) <> 'S'";
    $db = new PDO('mysql:host=localhost;dbname=anatec', 'admin', 'admin');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // testé avec et sans n'a pas d'influance sur la durée
    //envoie de la requete
    $req = $db->query($sql);
    //$db->query($sql); //même sans la stocker cela prends autant de temps
    $db = null;
    echo "<br/>durée: ".(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]); // entre 30 - 40 sec à chaque fois

    Pour la requête comme vous pouvez le voir, j'ai supprimé quasi tout les espaces et l'ai mis sur une ligne pour optimiser tout cela

    Config:
    mysql + apache + phpmyadmin sur le même serveur
    tests:
    via un client sur le même réseau local

    si vous avez des idées/questions n'hésitez pas

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut,

    ça ne sert strictement à rien de condenser ton code à part perdre toute lisibilité.
    Vu que tu annonces un temps d'exécution très court en direct via l'admin, il n'y a pas de raison que cela soit des interminable via PHP.
    Il faudrait que tu chronomètres séparément l'ouverture de la connexion new PDO() puis le $db->query() et reviens après

  3. #3
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    Bonjour,
    Effectivement je n'ai pas pensé à les chronométrer individuellement

    voici le code donc ré indenté avec les chrono
    Code PHP : 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
    $time_start_loading = microtime(true);
     
    $sql = "SELECT
                    ana_liste.nom_action, ana_marge.suffixe, ana_marge.date_num, STR_TO_DATE(ana_marge.date_date, '%d/%m/%Y'), ana_marge.sens, ana_marge.marge, ana_marge.jrs_posit, ana_marge.ma_jrsp,
                    ana_tende.dwphase_cac, ana_tende.dwprofil_cac, ana_tende.posbdfg_cac, ana_tende.posd200_cac, ana_tende.posd100_cac, ana_tende.posd050_cac, ana_tende.postdli_cac, ana_tende.poskal_cac, ana_tende.dwpente_cac, ana_tende.dwptcac_max, ana_tende.dwptcac_min, ana_tende.dwphase_act, ana_tende.dwprofil_act, ana_tende.posbdfg_act, ana_tende.posd200_act, ana_tende.posd100_act, ana_tende.posd050_act, ana_tende.postdli_act, ana_tende.poskal_act, ana_tende.dwpente_act, ana_tende.dwptact_max, ana_tende.dwptact_min, ana_tende.ifr_act, ana_tende.ifr_act_max, ana_tende.ifr_act_min
                    FROM ana_marge
                    INNER JOIN ana_liste ON ana_marge.suffixe = ana_liste.suffixe
                    INNER JOIN ana_tende ON ana_marge.suffixe = ana_tende.suffixe
                        AND ana_marge.date_num = ana_tende.date_num
                    WHERE ana_marge.sens = 'ACH'
                        AND ana_marge.ref_cfg = ''
                        AND SUBSTR(ana_marge.cas,1,1) <> 'S'";
     
    $time_start_connexion = microtime(true);
    $db = new PDO('mysql:host=192.168.0.23;dbname=anatec', 'admin', 'admin');
    $time_end_connexion = microtime(true);
     
    //envoie de la request
    $time_start_request = microtime(true);
    $req = $db->query($sql);
    $time_end_request = microtime(true);
     
    $db = null;
     
    $time_connexion = $time_end_connexion - $time_start_connexion;
    $time_request = $time_end_request - $time_start_request;
    echo "connexion time: ".$time_connexion."<br/>";
    echo "request time: ".$time_request."<br/>";
     
     
    $time_end_loading = microtime(true);
    $time_loading = $time_end_loading - $time_start_loading;
    echo "loading time: ".$time_loading;
    Voici les résultats
    connexion time: 0.0012328624725342
    request time: 34.754498958588
    loading time: 34.75576210022

    Et voici executé coté serveur en ligne de commande pour exclure l’influence apache au cas ou
    connexion time: 0.0023901462554932<br/>
    request time: 37.092872142792<br/>
    loading time: 37.104971885681

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Ok et question index sur la table ça dit quoi ?
    Poste voir la DDL

  5. #5
    Membre expérimenté
    Avatar de Sparky95
    Homme Profil pro
    Full Stack (web) developer
    Inscrit en
    Décembre 2016
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Full Stack (web) developer
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2016
    Messages : 384
    Par défaut
    La je n'ai pas vraiment compris ce que tu demandes / quoi faire
    Si tu me demandes si j'ai fais des index? => non

    Ajout:
    actuellement je suis occupé de retravailler toute la base je n'ai pas encore fais ces index c'est une table que j'ai repris hier et je suis occupé justement de lui optimiser.
    Ici je cherchais à optimiser les temps de réponse par requête en changeant déjà le type des données après je pensais commencer à lier ces tables par leurs index.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    l'optimisation passe principalement par le mise en place des index qui vont bien sur tes tables.
    Tant que tu n'as pas d'index, ça ne sert à rien de regarder les temps d'exécution des requêtes.

Discussions similaires

  1. probleme d'éxécution de requete SQL
    Par darkspoilt dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/05/2007, 17h37
  2. Probleme pour rediger ma requete sql
    Par JYM34 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 22/09/2006, 12h58
  3. [SQL] Probleme exploitation résultat de requete SQL
    Par ghargamaster dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/09/2006, 01h52
  4. Réponses: 26
    Dernier message: 23/06/2006, 15h45
  5. probleme lors d'une requete sql (controle non activé)
    Par junty dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/09/2005, 15h45

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