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 :

Requête SELECT lente


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2015
    Messages : 11
    Par défaut Requête SELECT lente
    Bonjour,

    je situe un peu le contexte.

    J'utilise GLPI pour faire l'inventaire de mon parc informatique.
    J'ai créé un plugin qui crée une table et qui stocke des informations sur les postes.

    J'ai une table "Computers" avec une clef primaire sur un "id".
    J'ai la table de mon plugin "MONPLUGIN" avec une clef primaire sur le "num_serie" du poste.

    Quand je fais un bête SELECT pour afficher les informations de "MONPLUGIN" associées aux postes, la requête met 60 secondes à s'exécuter.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT COMPUTERS.name AS 'Nom', 
    MONPLUGIN.societe AS 'Société', 
    FROM glpi_computers AS COMPUTERS
    LEFT JOIN glpi_plugin_champiws AS MONPLUGIN ON (COMPUTERS.serial = MONPLUGIN.num_serie )
    WHERE COMPUTERS.is_deleted = '0' 
    AND COMPUTERS.is_template = '0'
    GROUP BY COMPUTERS.name

    J'aimerais améliorer les performances de cette requête, mais je ne sais pas comment faire.

    Merci par avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Indexer ces colonnes ?

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2015
    Messages : 11
    Par défaut
    La requête finale est une requête créée à la volée pour afficher plusieurs champs de COMPUTERS et de MONPLUGIN.

    Si je ne me trompe pas, l'index est créé pour une requête donnée. Si on modifie les champs du SELECT, l'index n'est plus utilisé ?

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Non, l'index est créé dans la base, et porte sur une collection de colonnes dans une table.
    Il peut y avoir plusieurs index par table.

    Ils permettent d'accéder plus rapidement aux données en filtrant dans un arbre plutôt que séquentiellement.
    En contre-partie, ils alourdissent légèrement toutes les modifications de données sur la table (puisqu'on doit mettre à jour l'index).

    Commence par poser un index sur la table la plus grosse (plus une table est petite, moins elle tire partie d'un index).

    Un truc genre :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create index idx_computer_serial on computers (serial);

    is_template et is_deleted n'ont à priori pas besoin d'être indexés (un index est efficace quand l'arbre a beaucoup de feuilles... sur un booléen il n'y en a que deux, donc ça sert à rien).

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2015
    Messages : 11
    Par défaut
    Bonjour,

    je n'ai pas répondu hier soir car je voulais tester de nouveau ce matin.
    Hier soir je pensais avoir quelques secondes (passé de 77 à 73 sec), mais avec mes tests de ce matin je me rends compte qu'en fait les performances sont identiques avec ou sans index.

    je viens de regarder les index sur la table avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW INDEX FROM COMPUTERS
    is_template et is_deleted ont déjà tous les deux un index.


    P.S. : le temps d'exécution est de ~60 secondes en prod. Sur mon environnement de test, les performances sont moindres, ce qui explique les écarts de temps entre le premier message et celui-ci.

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2015
    Messages : 11
    Par défaut
    Je viens de regarder si les tables étaient fragmentées.
    Les 2 tables en question ne l'étaient pas, mais j'ai défragmenté les tables de la BDD qui l'étaient.

    Aucune amélioration.

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

Discussions similaires

  1. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  2. C'est possible dans une requête SELECT ?
    Par Kokito dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/04/2005, 16h59
  3. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  4. SQL Server 7.0 - Requête Select
    Par sangokus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/03/2004, 10h32
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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