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 :

Problème performance SELECT avec jointure


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème performance SELECT avec jointure
    Salut à tous,

    Je n'atteinds pas des millions d'enregistrements sur ma table, seulement des centaines de milliers (ça fait drôle de dire "seulement" ).

    J'ai une table de "photos" qui contient donc 585.000 enregistrements, elle a plusieurs clés étrangères, 3 exactement. J'ai ajouté un index sur ces trois champs. Mais les requêtes sont toujours aussi lentes, pour exécuter la requête suivante, utilisant deux jointures, il faut 14 secondes :

    SELECT * FROM t_phototypes,t_cd,t_prestataire
    WHERE fk_disque = id_disque
    AND fk_prest = id_prest
    AND nom_prest = "machin";

    Bref c'est pire quand il s'agit d'un UPDATE encore plus simple* dans cette table, il prend 6 secondes à s'exécuter et j'ai 349.455 UPDATE à faire sur cette table (car les valeurs à modifier diffèrent...)

    * :
    UPDATE t_phototypes
    SET corresp_cote='MH01234567'
    WHERE fichier_phot='MH01234567.tif';

    Bref quand j'entends 900 millions d'enregistrements et aucun problème je me dis qu'avec ma table de même pas 1 million j'ai rien compris

    Y'a-t-il un ou plusieurs moyens de résoudre mes problèmes de lenteur ? merci d'avance !

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Points : 180
    Points
    180
    Par défaut
    Post l'explain plan de ta requete pour voir si elle est optimisable.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    +---------------+------+------------------+-----------+---------+------------------------+------+-------------+
    | table         | type | possible_keys    | key       | key_len | ref                    | rows | Extra       |
    +---------------+------+------------------+-----------+---------+------------------------+------+-------------+
    | t_prestataire | ALL  | PRIMARY          | NULL      |    NULL | NULL                   |   15 | Using where |
    | t_cd          | ref  | PRIMARY,fk_prest | fk_prest  |       5 | t_prestataire.id_prest |  177 | Using where |
    | t_phototypes  | ref  | fk_disque        | fk_disque |      51 | t_cd.id_disque         |  217 | Using where |
    +---------------+------+------------------+-----------+---------+------------------------+------+-------------+
    Voilà j'espère que ça servira merci ren0 !

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Points : 180
    Points
    180
    Par défaut
    A première vue, tu n'utilises convenablement pas tes index.
    il me semble qu'on peu faire qqch...

    j'ai peu de temps ce soir...
    je te donne rdv demain

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ho cool merci ren0 de consacrer un peu de ton temps pour m'aider, voici la structure des trois tables utilisées dans cette requête, si ça peut t'aider :

    TABLE t_phototypes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    +-----------------+------------------+------+-----+------------+----------------+
    | Field           | Type             | Null | Key | Default    | Extra          |
    +-----------------+------------------+------+-----+------------+----------------+
    | id_phot         | int(10) unsigned |      | PRI | NULL       | auto_increment |
    | fichier_phot    | varchar(25)      | YES  |     | NULL       |                |
    | fk_disque       | varchar(50)      | YES  | MUL | NULL       |                |
    | fk_inv          | varchar(50)      | YES  | MUL | NULL       |                |
    | fk_prefixe      | varchar(4)       | YES  | MUL | NULL       |                |
    | dimensions_phot | varchar(50)      | YES  |     | NULL       |                |
    | poids_phot      | varchar(16)      | YES  |     | NULL       |                |
    | corresp_cote    | varchar(50)      | YES  |     | NULL       |                |
    | observ_phot     | text             | YES  |     | NULL       |                |
    | date_phot       | date             |      |     | 0000-00-00 |                |
    +-----------------+------------------+------+-----+------------+----------------+
    TABLE t_cd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    +-----------+-------------+------+-----+---------+-------+
    | Field     | Type        | Null | Key | Default | Extra |
    +-----------+-------------+------+-----+---------+-------+
    | id_disque | varchar(50) |      | PRI |         |       |
    | observ_cd | text        | YES  |     | NULL    |       |
    | poids_cd  | int(11)     | YES  |     | NULL    |       |
    | date_num  | date        | YES  |     | NULL    |       |
    | gen       | varchar(15) | YES  |     | NULL    |       |
    | fk_prest  | int(10)     | YES  | MUL | NULL    |       |
    +-----------+-------------+------+-----+---------+-------+
    TABLE t_prestataire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    +-------------+--------------+------+-----+---------+----------------+
    | Field       | Type         | Null | Key | Default | Extra          |
    +-------------+--------------+------+-----+---------+----------------+
    | id_prest    | int(10)      |      | PRI | NULL    | auto_increment |
    | nom_prest   | varchar(100) |      |     |         |                |
    | inter_prest | varchar(100) |      |     |         |                |
    | adr_prest   | varchar(255) |      |     |         |                |
    | cp_prest    | varchar(16)  |      |     |         |                |
    | ville_prest | varchar(100) |      |     |         |                |
    | tel_prest   | varchar(16)  |      |     |         |                |
    | fax_prest   | varchar(16)  |      |     |         |                |
    +-------------+--------------+------+-----+---------+----------------+

  6. #6
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Tu peux sans hésiter ajouter un index sur nom_prest et sur fichier_phot pour la requête UPDATE.

    cf http://dev.mysql.com/doc/mysql/fr/create-index.html et http://mysql.developpez.com/faq/?pag...S_mettre_index

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ho oui dis donc ça va beaucoup plus vite pour le UPDATE : 0.08 sec !!
    Merci Maximilian

    Par contre le select basé sur le nom du prestataire prend un peu plus de 12 secondes et je vois pas où ajouter d'index, y'en a sur tous les champs utilisés dans les critères de recherche...

  8. #8
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    c'était long, mais j'ai un peu de temsp à t'accorder...

    on va essayer d'avoir des jointures de type eq_ref et pas ref...

    l' explain plan change t'il dans ce cas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * 
    FROM    t_phototypes ph,
            t_cd c,
            t_prestataire pr
    WHERE c.id_disque = ph.fk_disque 
    AND  pr.id_prest = ph.fk_prest
    AND  pr.nom_prest = "machin";

Discussions similaires

  1. Réponses: 39
    Dernier message: 21/12/2011, 20h01
  2. Réponses: 8
    Dernier message: 16/08/2006, 14h39
  3. Delete + selection avec jointure
    Par kluh dans le forum Oracle
    Réponses: 4
    Dernier message: 15/11/2005, 10h44
  4. Problème de "select" avec des valeurs a null
    Par SchpatziBreizh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2005, 16h08
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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