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 :

Optimiser le temps de traitement d'une simple requête qui retourne 800 000 lignes.


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut Optimiser le temps de traitement d'une simple requête qui retourne 800 000 lignes.
    Bonjour à tous,

    Je voudrais accélerer l'affichage de ma requête qui est toute simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $rq_code_grp=mysql_query("select code_groupe, client from liste_grp");
    Voila comment je l'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // on affiche le resultat dans la zone de selection multiple 
    while ($uneligne=mysql_fetch_array($rq_code_grp)) 
    {
    echo "<option value=".$uneligne['code_groupe'].">".$uneligne['code_groupe']." <b>|</b> ".$uneligne['client']."</option>";
    }
    Il y a t-il un moyen d'afficher quasi instantanement les 800 000 lignes ?

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Tu veux mettre 800 000 options dans ton champ select ? Les utilisateurs seront sûrement ravis

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 67
    Points : 83
    Points
    83
    Par défaut
    C'est vrai que dans ce cas-là, un champ texte avec auto-completion serait une bien meilleure idée.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    En faite je desire faire un select multiple et balancer les valeurs dans un autre select multiple.

    Mais qu'entend tu par "un champ texte avec auto-completion " ?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par kamnouz Voir le message
    Mais qu'entend tu par "un champ texte avec auto-completion " ?
    Ben comme google...qui affiche des propositions au fur et à mesure que tu tapes, mais ça ne correspond peut être pas à ton besoin.

    A mon avis tu te trompe de table à interroger.
    Intéroge la table qui contient uniquement les code_groupe, pour avoir l'exaustivité des codes.
    N'utilise liste_grp que pour récupérer les code_groupe d'un client précis.

    Je t'assure un champ select multiple avec 800 000 possibilités n'est pas utilisable, sinon, en l'état, ta requête n'est pas optimisable.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kamnouz Voir le message
    En faite je desire faire un select multiple et balancer les valeurs dans un autre select multiple.
    Mets-toi un instant à la place de l'utilisateur et demande-toi si tu aimerais dérouler une liste de 800 000 lignes pour trouver le ou les quelques éléments que tu veux sélectionner !

    Mais qu'entend tu par "un champ texte avec auto-completion " ?
    Un champ de formulaire dans lequel l'utilisateur commence à saisir du texte et qui affiche les possibilités en affinant la liste au fur et à mesure de la saisie.

    Par exemple, pour un tel champ permettant de sélectionner un nom de personne, l'utilisateur commence à saisir 'D' et le système fait une requête sur la table des personnes avec le nom commençant par D. L'utilisateur continue sa saisie 'DU' et le système commence à restreindre en proposant par exemple 'DUPOND, DUPONT, DURAN, DURAND'. L'utilisateur continue en saisissant 'DUR' et le système ne propose plus que 'DURAN' et 'DURAND'...

    Il existe ce genre d'outil dans les bibliothèques Javascript telles que JQuery. On peut paramétrer le nombre de caractères saisis nécessaires pour commencer à requêter la table. Avec 800 000 lignes, il vaut mieux avoir au moins les 3 premiers caractères pour restreindre le nombre de possibilités à afficher et donc accélérer l'affichage.

    Mais tu dis que tu désires "faire un select multiple et balancer les valeurs dans un autre select multiple". Cela veut-il dire que, d'après ta requête, l'utilisateur va d'abord sélectionner les groupes puis les clients des groupes sélectionnés ?
    Si oui, alors fais deux requêtes, une pour chaque liste, en te basant pour la seconde sur le choix opéré par l'utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE code_groupe IN (...)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    c'est presque impossible que code ton code php ne dépasse pas les 30s de génération...
    et là même si tu génères la page le temps de génération coté navigateur va être une horreur...

    y a pas que ton pauvre select sur la page hein?

    donc tu peux:
    • si tu comptes contraindre ton select alors tu peux le faire en choisissant une valeur de contrainte par défaut et bien sur limiter le nombre de propositions renvoyées (10 à 20 max)
    • abandonner le select et passer à un affichage par page de tes résultats pour scinder tes 800000 lignes
    • utiliser l'auto-complétion style google comme le dit skuatamad, en utilisant ajax pour envoyer ce que tu saisis à un script qui génère une liste limitée de suggestions (10 entrées sinon ça devient n'importe quoi pour l'utilisateur)
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup de l'interet que vous portez à mon problème.

    En faite j'ai un 1er select multiple que je remplis via ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <tr>
    <td><select name="lstbox1" id="one" size="5" multiple="multiple"STYLE="height:150; width:400 ; color:#606060; face:arial; font-weight:bold;"ondblclick="bascule(this,'two')" >
    <?php
    $rq_code_grp=mysql_query("select code_groupe, client from liste_grp");
    // on affiche le resultat dans la zone de selection multiple 
    while ($uneligne=mysql_fetch_array($rq_code_grp)) 
    {
    echo "<option value=".$uneligne['code_groupe'].">".$uneligne['code_groupe']." <b>|</b> ".$uneligne['client']."</option>";
    }
    ?>
    </select>
    </tr>
    Et lorsque je double-clic sur une valeur du 1er select multiple et bien sa le balance dans celui-la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <td><select name="code_groupe[]" id="two" ondblclick="bascule(this,'one')"STYLE="height:150 ; width:400; color:#ff0000; face:arial; " multiple="multiple" size="9"> </select>
    Donc la solution de champ texte avec auto-completion ne convient pas trop parceque l'utilisateur n'aura pas la possibilité de choisir plusieurs valeurs .

    .... Comment faire ?

  9. #9
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    déja une présélection obligatoire dans le 1er sélect qui par défaut réduit la list originale

    si tu as un index sur ce critère dans ta table tu réduiras drastiquement déjà le temps de parcours...

    ton critère pour décider de la méthode c'est combien de résultats doivent pouvoir être sélectionnés (si tu réponds plus de 30 à mon avis tu devrais revoir ta façon de penser ton problème

    le problème c'est que on sait pas quel type de choses tu veux traiter...
    selon le sujet tu peux scinder ta table en différents sous domaines et donc de faire une cascade de sélections dynamiques qui réduiront les résultats
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Discussions similaires

  1. Réponses: 24
    Dernier message: 17/05/2010, 17h54
  2. optimiser le temp du traitement d'une boucle
    Par riad_09 dans le forum Développement
    Réponses: 1
    Dernier message: 05/11/2009, 08h38
  3. Optimisation du temps de traitement
    Par djuddju dans le forum Oracle
    Réponses: 4
    Dernier message: 20/04/2006, 21h16
  4. Réponses: 9
    Dernier message: 20/06/2005, 12h17
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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