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

Requêtes MySQL Discussion :

Optimiser mon traitement de données


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2003
    Messages : 89
    Par défaut Optimiser mon traitement de données
    Bonjour,
    Je vous explique mon petit problème.
    Alors voila, j'ai une table de membres. De cette table j'extrais environ 20.000 enregistrements.
    Pour chacun de ces 20.000 membres, je vais chercher les personnes qui font partie de leur carnet d'adresse.

    Ensuite pour chacune de ces personnes du carnet d'adresse (maximum 10 par membre) je fais une boucle qui permet d'extraire les messages postés par chaque personne dans le forum A ou le forum B et une deuxième boucle permettant d'extraire les messages postés par chaque personne dans le forum C ou D.

    On pourrait schématiser ainsi:

    Sélection des 20.000 membres => (G1)
    ---> Extraction des personnes qui appartiennent au carnet d'adresse pour chaque membre de (G1) => (G2)
    ------> Extraction des messages postés sur le forum A ou sur le forum B
    pour les membres de (G1) => (G3)
    ------> Extraction des messages postés sur le forum C ou D pour les membres de (G1) => (G4)

    Ensuite on affiche les informations dans un tableau du style
    Id membre (G1) | Membres du carnet d'adresse (G2) | Messages (G3) | Messages (G4)


    Donc j'ai testé pour 500 membres (G1) la requête mets 269 secondes à s'exécuter et j'en ressort 129 messages (55 de G3 et 74 de G4)

    Je voulais savoir comment optimiser tout cela sachant qu'à terme ce ne sera plus 500 mais 20.000 membres minimums.

    Je précise que cette requête sera exécutée une fois par jour en CRON.

    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    Si ta base est assez solide, je te conseille de remplacer les boucles par une seule requete avec des jointures directement.

    Sinon, remplace les requetes executées dans les boucles pour chaque personne par la construction d'une requete avec quelque chose comme : Utilisateur.ID IN(....*liste des ID des utilisateurs*...) pour faire une seule requete a la fin.
    Eventuellement gerer un tableau indexé par les ID d'utilisateurs pour retrouver facilement les infos dont tu as besoin.

    Enfin, si tu dois faire plus d'une requete et que la 1ere est la plus longue, tu peux commencer a faire le traitement avant qu'elle ait fini de s'executer grace a http://fr3.php.net/manual/fr/function.mysql-unbuffered-query.php. (Je te conseille aussi de lire les notes, certaines sont interessantes)

  3. #3
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Donc j'ai testé pour 500 membres (G1) la requête mets 269 secondes
    Elle à quelle tete ta requete ? Parceque bon 20 000 lignes c'est peanut normalement, même pour sqlite.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Par défaut
    Avant, j'avais créé un jeu en ligne avec un plateau de 100 cases sur 100 cases.

    Je fesais donc une requètes avec le retournement des 10 000 cases et en plus, j'ajoutais des infos sur la cases, le propriétaire etc...

    Avant optimisation, le script était en timeout. (boucle executée 10 000 fois, une requète SQL à chaque fois )

    Après, 1seconde à peine!

    Pour cela, la construction d'une seule requète est indispensable!
    (Jointure...)

  5. #5
    Membre confirmé
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2003
    Messages : 89
    Par défaut
    Merci pour vos réponses.
    Je vais essayer d'optimiser tout ça et je reviends vers vous si c'est toujours aussi long.

    Sinon ma requête qui extrait les membres au départ (500 puis par la suite 20.000) met 1.01 secondes à s'exécuter sous PHPmyAdmin.

  6. #6
    Membre confirmé
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2003
    Messages : 89
    Par défaut
    J'ai modifié mes requêtes, dorénavant je n'en ai plus que 2 au lieu de 4.

    Donc de ma table contenant environ 60.000 enregistrements, j'en sélectionne 2000 (à terme il y en aura 25.000 minimums d'extraits).
    Je cherche les correspondances de ces 2.000 membres dans ma deuxième requête.
    Il en ressort 600 correspondances.

    Et la page a mis 283 secondes à se charger. Mais le script ne s'est pas interrompu.

    Sachant que cela sera exécuté en CRON, je n'aurais pas de contrôle direct sur l'application lorsqu'elle s'exécutera chaque nuit.
    Comment faire pour être sur que ma requête s'exécute sans se bloquer ?
    Car à vue d'oeil il faudra 56 minutes pour l'exécuter ! Cela est énorme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT id_trajet, id_region_d, id_dept_d, id_region_a, id_dept_a,
    status, id_membre, id_ville_d, id_ville_a, date_depart, id_frequence
    FROM textes
    WHERE ((id_dept_d = 78 AND id_dept_a = 83 AND id_ville_d <> id_ville_a)
    OR (id_ville_d = 19094 AND id_ville_a = 34113)) 
    AND textes.id_membre <> 1 AND textes.date_entree = DATE_ADD(SYSDATE(), INTERVAL - 1 DAY) 
    AND (date_depart >= DATE_SUB('2006-05-18', INTERVAL 1 DAY )) 
    AND (date_depart <= DATE_ADD('2006-05-18', INTERVAL 1 DAY)) 
    AND (id_frequence = 6)
    La table "textes" contient 31.000 enregistrements environ.
    Voyez vous une amélioration qui pourrait me faire gagner beaucoup de temps ?

    Merci

  7. #7
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Je pose la question par acquis de conscience, tes tables ont elles des index ?

    Peux tu tenter avec phpmyadmin de faire

    EXPLAIN SELECT ... (ta requete);

    Tu devrais avoir des infos intéressantes, entre autre les endroits ou ca coince le plus.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/07/2008, 15h01
  2. traitement des données avant envoie dans MySQL
    Par italiasky dans le forum SQL Procédural
    Réponses: 13
    Dernier message: 07/02/2006, 22h50
  3. [C#] Comment optimiser mon constructeur ?
    Par blbird dans le forum C#
    Réponses: 2
    Dernier message: 19/01/2006, 14h41
  4. Programmation pour traitement de données
    Par benbois dans le forum Langages de programmation
    Réponses: 16
    Dernier message: 19/10/2005, 17h01
  5. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29

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