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

 MySQL Discussion :

quel index pour ma requete


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Par défaut quel index pour ma requete
    Je suis vraiment embêté avec une requete qui met 14 seconde pour s'accomplir.
    DELETE FROM `client`
    WHERE NOT `ref_client`IN (SELECT distinct `id_client`FROM `appareils` WHERE `id_client`>0)
    AND NOT `ref_client`IN (SELECT distinct `id_client`FROM `entetes` WHERE `id_client`>0)
    AND NOT `ref_client`IN (SELECT distinct `id_client`FROM `commande` WHERE `id_client`>0)
    AND NOT `ref_client`IN (SELECT distinct `id_client`FROM `caisse` WHERE `id_client`>0)
    Un index existe sur chaque table pour le champ "id_client" mais cette fonction reste lente.
    Je ne sais pas comment construire un index qui permettrait d'accélérer cette procédure.
    Help me please. Merci.

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    la colonne ref_client est-elle indexée ?

    D'autre part, je pense que le NOT ref_client IN c'est pas le top...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NOT `ref_client`IN (SELECT distinct `id_client`FROM `appareils` 
    WHERE `id_client`>0)
    est-il équivalent à
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     `ref_client`IN (SELECT distinct `id_client`FROM `appareils` 
    WHERE `id_client` <=0)
    ?

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    À la place de , ce serait plutôt Dans la mesure où tu veux supprimer des clients, je suppose qu'aucun n'a comme ref_client la valeur 0 ?
    Dès lors, la condition WHERE id_client > 0 est inutile. A moins que tu aies des clients avec un ref_client négatif ?

    Essayons une autre solution...
    Dans ta requête, tu veux supprimer les clients qui ne sont pas référencés dans les 4 tables appareils, entetes, commande, caisse.
    Tu peux faire une jointure externe vers ces 4 tables et tester la nullité des id_client dans les 4 tables référencées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELETE FROM client AS cl
    LEFT OUTER JOIN appareils AS a ON cl.ref_client = a.id_client
    LEFT OUTER JOIN entetes AS e ON cl.ref_client = e.id_client
    LEFT OUTER JOIN commande AS cm ON cl.ref_client = cm.id_client
    LEFT OUTER JOIN caisse AS ca ON cl.ref_client = ca.id_client
    WHERE a.id_client IS NULL
      AND e.id_client IS NULL
      AND cm.id_client IS NULL
      AND ca.id_client IS NULL
    Et pour répondre à la question de ton message, il faut évidemment que ref_client et id_client soient indexés.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  4. #4
    Membre éclairé
    Homme Profil pro
    électronicien
    Inscrit en
    Octobre 2006
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : électronicien
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 225
    Par défaut
    Merci de vos conseils. Je n'avais pas vu dans la table "appareils" que le champ "id_client" n'était pas indexé. Tout rentre dans l'ordre.... J'en ai profité pour modifier ma formule, mais ça ne fait pas gagner de temps.

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

Discussions similaires

  1. quel logiciel pour faire requete sql
    Par plm222 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/10/2012, 06h27
  2. Quel index pour une requête bornée ?
    Par Michel Rotta dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/02/2011, 16h34
  3. Creation d'index pour une requete
    Par firejocker dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/07/2009, 15h17
  4. Quels index pour cette requete ?
    Par bertra dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/10/2008, 19h07
  5. Requetes et Index pour optimisation...
    Par manuds dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/03/2006, 09h05

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