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 :

requetes trop longue


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2010
    Messages : 89
    Points : 82
    Points
    82
    Par défaut requetes trop longue
    Bonjour,

    Je parse un fichier générant des insert dans une base.
    Le nombre d'enregistrement générer est tres important (~150000 insert) et bien sur mon script par en timeout.
    Le seul moyen que j'ai trouvé est d'augmenter la valeur du time out et de séparer les taches (un serveur web et un serveur bdd). Mon problème est que malgré cela, il arrive encore de tombé en timeout et augmenter encore cette variable me dérange un peu (720 en test et 360 en prod).

    Il faut également savoir qu'avant l'insert, je suis obliger de faire plusieurs select pour récupérer et/ou vérifier les informations que je vais injecter. Evidemment, cela n'arrange rien...

    Une idée lumineuse? une solution miracle?
    Merci d'avance.
    Luke, j'ai bien connu ta mère!

  2. #2
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu fais tous les contrôles que tu veux sur le fichier et les corrections éventuelles puis tu utilises une requête LOAD DATA INFILE
    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 !

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Cinephil > Surtout pas !
    Ce sera beaucoup plus efficace de charger toutes les données en base dans une table dédiée, puis de faire les contrôles avec une requête par contrôle, puis d'insérer ce qui est valide, toujours en ensembliste.

    C'est ainsi que fonctionne les alimentations de datawarehouse !

  4. #4
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    J'avais cru comprendre qu'il partait de données en fichier texte mais peut-être que mon rhume empêche l'oxygénation correcte de mes neurones !
    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 !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est ce que je dis !

    On monte le fichier texte dans une table dédiée, sans contrôle avec un loader par exemple - je ne sais pas si ça existe sous MySQL.

    Puis on fait le select avec les jointures qui vont bien pour créer l'ordre d'insertion.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2010
    Messages : 89
    Points : 82
    Points
    82
    Par défaut
    Hello,

    Je pars d'un fichier Excel et je dois travailler dessus dans son format natif.
    Si le script ne fait que lire le fichier, il s'exécute avec une vitesse satisfaisante mais des qu'intervient l'interaction avec la BDD, c'est la mort (du serveur).

    J'ai penser a l'injection brut et direct dans une table dédié mais après essais, ce n'est pas très concluent.
    Ou alors je m'y prend mal. Peu être qu'en vous expliquant la structure du fichier, vous y verrez plus clair que moi.
    En colonne, j'ai des articles et les infos sur cette article. Il n'y a de limite au nombre d'articles que le nombre de colonne de Excel.
    En ligne j'ai des noms,adresse etc... De même, il n'y a de limite que le nombre de lignes que Excel permets.
    A l'intersection de ces 2 infos, j'ai un nombre (ou pas) qui m'indique combien de cette articles, une personne désire.
    je dois injecter les articles, les destinataires et leurs demandes dans ma base.
    Je ne vois pas comment injecter ça autrement que dans 3 tables différentes et pour ne pas perdre le fil, attribuer les index nécessaires dans les tables adéquat ce qui reviens a mon injection final.

    Est ce que travailler avec des procédures stockées plutôt que des requêtes du serveur web pourrais me faire gagner encore quelque précieuse millisecondes ?
    Au niveau config du serveur mysql, est ce que je peu 'joué' avec quelque variable pour le gonfler un peu ?

    Merci de vous pencher sur mon problème.

    A+
    Luke, j'ai bien connu ta mère!

  7. #7
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si je comprends bien, tu as un tableau de la sorte ?
    Nom Prénom Adresse Article1 Article2 Article3 ...
    Dupont Jean sonAdresse 1 0 3
    Durand Jacques saMaison 0 1 4
    ...
    Je ferais comme ceci :
    1) Convertir le fichier Excel en .csv

    2) En PHP, extraire la première ligne du fichier et récupérer les noms des articles dans un tableau.

    3) Charger dans une table des articles les différents articles par une requête INSERT qui boucle sur le tableau PHP.

    4) LOAD DATE INFILE du fichier CSV.
    Ca donnera une table avec des colonnes ayant le même nom que la première ligne du fichier, donc les caractéristiques des personnes plus les noms des articles.

    5) Extraire les différentes personnes dans une table des personnes (p_id, p_nom, p_prenom, p_adresse...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO personne (p_nom, p_prenom, p_adresse)
    SELECT DISTINCT Nom, Prenom, Adresse
    FROM temp
    ORDER BY Nom, Prenom
    6) En boucle sur le tableau PHP insérer les correspondances personne <-> article dans une table associative besoin (b_id_personne, b_id_article, b_quantite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $nom_article = $article[i];
    $requete = "
      INSERT INTO besoin (b_id_personne, b_id_article, b_quantite)
      SELECT p_id, a_id, t.".$nom_article."
      FROM temp AS t
      INNER JOIN personne AS p 
        ON p.p_nom = t.Nom
          AND p.p_prenom = t.Prenom
          AND p.p_adresse = t.Adresse
      WHERE a.a_nom = '".$nom_article."'
        AND t.".$nom_article." > 0
    ";
    La requête est peut-être à peaufiner mais c'est l'idée.

    J'espère que tu n'as à faire ça qu'une fois pour remplacer définitivement ce tableau Excel immonde ?
    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 !

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2010
    Messages : 89
    Points : 82
    Points
    82
    Par défaut
    Pour casser l'ambiance...

    nan ce tableau m'arrive tous les 15 jours et malgré mes pressions je n'aurais rien d'autre que ça... j'ai déjà réussi à imposer un fichier structurer parce qu'avant le nombre de cellules fournissant les adresses ou les infos sur un article était aléatoire. Impossible de calibrer un masque d'import la dessus.

    L'autre contrainte c'est que c'est une personne externe a la quel je ne peu demander de transformer son fichier en .cvs (discussion fermer sur ce point) d'où mon obligation de travailler sur le fichier Excel.

    De plus, comme je le disais dans mon message précédent, le nombre d'article n'as de limite que le nombre de colonnes que Excel permets. Cela serai trop simple si il n'y avait qu'une seul fiche...

    J'en suis a un points ou j'en rêve la nuit (et ya pas de fleur rose dans mon rêve)...

    Sinon dans l'idée, le protocole que tu me donne est sensiblement celui que j'utilise en faisant abstraction du load_in_file bien sur.
    Luke, j'ai bien connu ta mère!

Discussions similaires

  1. requete trop longue?
    Par samplaid dans le forum Débuter
    Réponses: 1
    Dernier message: 11/08/2008, 09h53
  2. requete trop longue
    Par realkilla dans le forum WinDev
    Réponses: 6
    Dernier message: 05/12/2007, 14h33
  3. pb requete trop longue
    Par Leimi dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/07/2006, 16h16
  4. requetes trop longues
    Par caro_tpl dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/07/2006, 14h27
  5. Requete trop longue à exécuter
    Par fguilbert dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/06/2006, 10h33

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