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 la vistesse d'execution


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 34
    Points
    34
    Par défaut Optimiser la vistesse d'execution
    Bonjour tout le monde,

    J'ai un gros problème avec une de mes applications:

    Je veux mettre à jour une table
    Pour faire ca j'ai un fichier texte d'ou j'extrait le infos
    Pour les extraire pas de problème c'est du php donc je m'etend pas

    Je crée ensuite ma requete pour chaque ligne du fichier texte
    (environ 60000);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table SET dispo="info5" WHERE ref='info1'
    Ca fait donc beaucoup de requete à balancer, et ca me prend 2h30 pour les executer et qui staure aussi au niveau des processus dans la base MySql .
    Je voudrais donc savoir s'il il existe un moyen d'optimiser tout ca, comme tout mettre dans un fichier texte et executer tout ou autre chose

    Si vous avez des idées je prend tout car la c vraiment galére
    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    L'idée c'est surtout que tu ne devrais pas avoir à exécuter autant de requêtes, surtout en une seule fois... N'y a-t'il pas moyen d'appliquer à la base les changements apportés à ce fichier texte en temps réel ?

    Sinon, si tu dois malgré tout effectuer autant de modifications à la fois le mieux serait encore de le faire sur une nouvelle table. Si tu remplaces tous les enregistrements de "table" voici comment je procéderais:
    1. Créer une nouvelle table identique à la première
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      CREATE TABLE tmptable LIKE table
    2. Insérer les enregistrements par groupe
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      INSERT INTO tmptable (dispo, ref) VALUES ('info5', 'info1'), ('xxx', 'yyy'), ('mmm', 'nnn')
    3. Remplacer l'ancienne table par la nouvelle. L'opération est atomique donc il y en permanence une table nommée "table"
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      RENAME TABLE table TO oldtable, tmptable TO table
    4. effacer l'ancienne table

    La raison de toute cette manœuvre est simple: faire des INSERTs (par séries, comme ici) est beaucoup plus rapide que de nombreux UPDATE. Tu peux également essayer le mot-clé "DELAYED" dans la requête INSERT, cela peut améliorer encore un peu les performances. Ne pas créer d'index sur tmptable avant insertion puis les créer une fois le traitement terminé est aussi une option à explorer car recréer tout un index à la fois est plus rapide que le mettre à jour plusieurs fois d'affilée.

    Même dans le cas où la mise à jour ne concerne pas toute la table table je procéderais de façon similaire: créer tmptable, la remplir, faire un gros "DELETE" sur table du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE table.*
    FROM table, tmptable
    WHERE table.ref = tmptable.ref
    (en supposant que "ref" est ta clé primaire) puis réinsertions des enregistrements à jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO table
    SELECT * FROM tmptable
    Attention, dans ce cas il y a un instant (plus ou moins long) où table ne sera pas "correcte" d'un point de vue des enregistrements qu'elle contient. Donc il faudra s'abstenir d'exécuter des requêtes dessus entre le DELETE et l'INSERT, ou simplement la vérouiller en lecture/écriture.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Une précision: les requêtes ci-dessus sont données à titre d'exemple et certaines ne fonctionnent que sous MySQL 4.1.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Pour le nombre de requete en simultané, je n'ai pas le choix sinon je l'aurais déjà fait, je vais donc essayer comme tu as dit et puis je vous dirais quoi
    Merci bocoup
    Minimoi

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 34
    Points
    34
    Par défaut
    Bon, j'ai résolu mon problème autrement
    J'ai mis toute les requete dans un fichier sql
    et j'ai rajouté une commande pour executer
    un fichier bat qui prend en charge toute l'execution
    Donc un pti résolu

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 09/02/2010, 20h08
  2. Méthode d'optimisation lors de l'execution d'une macro
    Par AzelRoth dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/04/2009, 10h27
  3. Optimisation du temps d'execution en C
    Par xinu666 dans le forum SQLite
    Réponses: 4
    Dernier message: 02/05/2008, 09h54
  4. optimisation de temps d'execution de requête
    Par Smix007 dans le forum SQL
    Réponses: 7
    Dernier message: 21/06/2007, 17h49
  5. Optimiser taille d'un executable
    Par ced00 dans le forum Delphi
    Réponses: 17
    Dernier message: 07/10/2006, 09h07

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