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 :

Optimisation des requêtes ?!


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut Optimisation des requêtes ?!
    Bonjour,

    J'aurai souhaité vos avis sur ma problématique.

    J'ai une base de données Mysql 4.0 qui contient une table CLIENT (env. 800.000 lignes) de type innodb.

    Chaque jour, je reçois un fichier descrivant des changements de contrat client que je dois integrer pour tenir ma bdd à jour.
    Ce fichier de changements fait env. 100.000 lignes.

    Si le client est dans ma base, 1 changement de contrat entraine deux requêtes au niveau de ma bdd :
    - un update (mise a jour de contrat) ou un delete (resiliation),
    - un insert (log de l'enregistrement du changement de contrat).

    Par suite, et dans le cas ou les 100.000 lignes correspondraient au pire à des changements de contrat impactant 100.000 clients réellement dans ma
    base (ce qui n'est pas forcement le cas), j'aurai :
    - 100.000 select à faire pour vérifier que le client est dans ma base,
    - le cas échéant, 200.000 requêtes (update ou delete + insert) à lancer sur le serveur MYSQL.


    Par suite, plutot que de parcourrir le fichier avec un batch, de faire un select pour voir si le client existe dans ma base et ensuite faire l'opération
    correspondante (= select + update ou delete + insert) si nécessaire, j'ai l'idée de créer un fichier contenant la totalité des commandes SQL (indépendamment du fait de savoir si le client existe bien chez moi), pour ensuite l'executer via "mysql .... < contrat.sql"

    Pensez-vous que ce soit une bonne solution ?
    Le fait de lancer un update sur une table qui retournerait "0 row(s) affected" est-il consomateur, est-il plus consomateur qu'un select ?

    Merci de vos réponses !!
    izioto

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Bonsoir,

    Mon post n'ayant pas l'air de mobiliser les foules je vais poser la question autrement !!

    Imaginons que j'ai 100 select à faire pour conditionner la réalisation de 20 update. En tout cela fait 120 requêtes passées sur le serveur.

    Est-il déconnant dans ce cas, de lancer directement 100 update en ce disant que 20 vont modifier la bdd et 80 retourneront "0 row(s) affected" !!

    Lancer un update est-il plus consomateur qu'un select ?
    Quels sont également les impacts en terme d'accès à la bdd par d'autre process (lock ??)

    Maaaarci

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Tu peux regarder de ce côté :
    http://dev.mysql.com/doc/refman/5.0/fr/replace.html

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Salut,
    vois le conseil de Jeca sur les Replace

    Tu peux aussi peut-être faire un update avec jointure multitable (et te rapprocher d'un sélect) : ainsi seules les lignes retournées par le sélect seront mises à jour.
    http://dev.mysql.com/doc/refman/5.0/fr/update.html (tout à la fin de l'article)

    Quant à l'insert ... select ... c'est encore plus facile

  5. #5
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par izioto Voir le message
    Lancer un update est-il plus consomateur qu'un select ?
    Quels sont également les impacts en terme d'accès à la bdd par d'autre process (lock ??)
    Je ne suis pas tout à fait certain mais l'update ne doit pas être vraiment plus couteux s'il ne modifie rien. Par contre les verrous sont peut-être à surveiller surtout si la BDD est très utilisée pendant ce temps car même si la requête ne change rien InnoDB peut poser des verrous le temps de son exécution.

    Sur un update InnoDb pose des verrous sur toutes les lignes examinées, même si elles ne sont pas au final modifiées. Si la recherche passe par un indexe très sélectif presque rien n'est verrouillé. Par contre si aucun indexe n'est utilisé (ou s'il est trop peu sélectif) on se retrouve à verrouiller toute la table.

    A première vue ici les enregistrements concernés sont bien identifiés donc ça devrait aller...

    ...cela dit je suis myope

Discussions similaires

  1. optimisation des requêtes sur AS400
    Par horalass dans le forum DB2
    Réponses: 2
    Dernier message: 10/08/2006, 21h22
  2. Réponses: 4
    Dernier message: 26/01/2006, 10h35
  3. liens sur l'optimisation des requêtes
    Par tung-savate dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/10/2005, 21h02
  4. optimisation des requêtes
    Par user_h dans le forum Oracle
    Réponses: 4
    Dernier message: 17/10/2005, 12h50
  5. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03

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