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 :

[php-mysql] Requete gros traitements


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 213
    Points : 111
    Points
    111
    Par défaut [php-mysql] Requete gros traitements
    Bonjour,

    Dans ma base de données, je gére des badges. Je doit changer le format des badge. Ils sont sur 3 chiffres et on doit passer à 3 lettres.

    Donc je doit mettre à jour 3 tables pour chaque personnel. Soit environ 15000 requetes.

    Dans un premier temps j'ai fait au plus simple je parcours la table des personnels, et je lance les 3 requétes de mise à jour. Ca fonctionne sauf que je suis limité à 30 secondes pour la durée de mon script ce qui correspond à envrion 500 personnels j'en ai envrion 5000 (chose que je ne peut modifier).

    D'où m'est venu l'idée de de faire des lots. Problème je ne sais pas trop comment faire.

    J'ai essayé en concaténant des requétes mais j'ai une erreur de syntaxe. Voici la synthaxe que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $update_histo.="UPDATE inv_utilisateur_badge SET badge='".$badge[$nb_badge]["badge"]."', u_id='" . $req[$nb_badge]["u_id"] . "', date_attribution='$current_datetime'; ";
    j'utilise un ; pour séparer mes requétes mais visiblement mysql_query (je m'en doutais) n'aime pas trop voici l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1064: Erreur de syntaxe près de '; UPDATE inv_utilisateur_badge SET badge='4PO', u_id='33378', da' à la ligne 1
    Qu'en pensez vous ? D'avance merci de vos réponses.

  2. #2
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Salut,

    mysql_query() ne permet d'envoyer qu'une seule requête à la fois. De plus, ça n'aurait rien changé niveau performance, le serveur les aurait traitées l'une après l'autre.

    Est-il normal que tu n'aies aucune clause WHERE dans ta requête ?? Le changement de badge peut-il se faire par un "calcul" ou possèdes-tu une liste de correspondance xxx->yyy ?

    Je suppose que tu ne travailles pas avec des tables InnoDB. Dans ce cas, tu n'aurais eu qu'une seule requête à faire et les contraintes de clés étrangères auraient garder la cohérence.

    Pour optimiser, tu peux tenter de faire des prepared statements si tu utilises MySQL >= 4.1 : voir http://maximilian.developpez.com/mys...ed-statements/.

    De plus, tu peux tenter de faire tous tes updates dans une seule transaction puis faire un commit à la fin (InnoDB). Pour MyISAM, tu peux simuler ce comportement avec un LOCK sur les tables concernées.

    Je ne sais pas si tu vas pouvoir passer sous la barre des 30sec, mais c'est déjà un début.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 213
    Points : 111
    Points
    111
    Par défaut
    Le pb est que je suis en myIsam et PHP 4. comme tu l'a remarqué.
    Merci pour les infos. J'ai regardé mais visiblement ça marche pas avec php4

  4. #4
    Membre expérimenté

    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
    Points : 1 565
    Points
    1 565
    Par défaut
    tu peux essayer d'utiliser cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE table
    SET badge = CASE 
    WHEN u_id = ... THEN ...
    WHEN u_id = ... THEN ...
    ELSE badge END, 
    date=date, ...
    en générant automatiquement la requete UPDATE a partir d'une liste d'u_id et de nouvelles valeurs de "badge" associée. J'ai deja fait un truc identique pour une migration de donnée un peu comme toi et ca marchait bien.

    Par contre, ca n'empeche que tu devra sans doute faire un traitement par lot pour pas traiter tout les utilisateurs en meme temps.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 213
    Points : 111
    Points
    111
    Par défaut
    J'ai essayé avec le case mais c'est plus lent.

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

Discussions similaires

  1. [MySQL] PHP MySql - Requete complexe
    Par tideqc dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/10/2012, 01h53
  2. [MySQL] php/mysql requete s'executant deux fois
    Par soohikei dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/05/2010, 11h58
  3. [PHP/MySql] requete complexe
    Par jfrag dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/09/2006, 10h16
  4. requete php mysql
    Par calitom dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/02/2006, 16h24
  5. Réponses: 2
    Dernier message: 08/11/2005, 23h55

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