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 :

Requete Multi jointure lourde, besoin d'optimisation


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Points : 45
    Points
    45
    Par défaut Besoin d'optimiser sur un simple LIMIT 5 ! (2 Millions enregistrements)
    Bonjour,

    Voici mon soucis, j'ai mon site qui rame sévère depuis que j'ai ajouté énormément de données dans ma base ( 300 000 entrées soit environ 150 mo).

    Manière de synthétiser tout ça, sur 2 requetes ( l'une pour afficher les 5 derniers inscrits, et l'une sur les 5 qui ont le plus de visites), j'ai besoin sur chacune d'elle de lister les informations permettants de reconstituer l'url rewriting a la volée, soit 7 JOINTURES par requetes.

    Voici un exemple pour les 5 derniers clients.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT c.id_client,nom_societe,logo_client,prestation_client,fiche_vue_client, m.id_metier AS id_metier, nom_metier, cm.id_cat, nom_cat, com.id as id_ville, com.ncc as nom_ville,d.dep as id_dep FROM client c 
    JOIN ville_du_client vc ON vc.id_client = c.id_client 
    JOIN communes com ON com.id = vc.id_ville 
    JOIN departements d ON d.dep = com.dep 
    JOIN metier_du_client mc ON mc.id_client = c.id_client 
    JOIN metier m ON m.id_metier = mc.id_metier 
    JOIN categorie_du_metier cdm ON cdm.id_metier = mc.id_metier 
    JOIN categorie_metier cm ON cm.id_cat = cdm.id_cat 
    WHERE valider_client=1 AND prestation_client != '' 
    GROUP BY c.id_client 
    ORDER BY c.id_client DESC 
    LIMIT 0,5
    Comme vous le voyez c'est assez lourd.. d'un premier jet, voyez vous des erreurs ?

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Bonjour,

    Pourrait-on avoir le résultat d'un EXPLAIN ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXPLAIN la requête à analyser
    Pensez au tag

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Points : 45
    Points
    45
    Par défaut
    Biensur


    Id_ville,id_cat sont deja soit un PRIMARY,soit un INDEX, donc je ne comprends pas pourquoi il ne s'affiche pas.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Points : 45
    Points
    45
    Par défaut
    Je reviens à vous, j'ai testé une requete pour savoir si cela venai de la lourdeur de la JOINTURE mais non, toujours tres long a charger avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    connection_BD();
    $req_last_add = "SELECT c.id_client,nom_societe,logo_client,fiche_vue_client FROM client c ";
    $req_last_add .= "WHERE valider_client=1 ";
    $req_last_add .= "ORDER BY c.id_client DESC LIMIT 0,5";
    $res_last_add = send_sql($req_last_add,'LAST CLIENTS');
    mysql_close();
    Ca m'est toujours 30 sec sur le premier chargement (apres c instantané > cache mysql je pense)


    Une idée ? sachant que j'ai 2 Millions d'eregistrements !

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Un index avec les clés ('VALIDER_CLIENT', 'ID_CLIENT') devrait augmenter beaucoup la rapidité de la requete si ce n'est pas encore fait.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Points : 45
    Points
    45
    Par défaut
    déjà le cas c'est ça le pire..

    Edit : une clef primaire (PRIMARY) est bien un index ? ou faut clef primaire + INDEX

  7. #7
    Membre confirmé
    Avatar de omiossec
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2002
    Messages : 241
    Points : 563
    Points
    563
    Par défaut
    Citation Envoyé par kangaxx Voir le message
    Un index avec les clés ('VALIDER_CLIENT', 'ID_CLIENT') devrait augmenter beaucoup la rapidité de la requete si ce n'est pas encore fait.
    Surtout pas !

    1. la clause ORDER BY contient "id_client", l'index composite contient deux valeurs ('VALIDER_CLIENT', 'ID_CLIENT') et serat donc trier par "VALIDER_CLIENT". Cela obligerat MySql à utiliser une table temporaire pour trier le resultat (using filesort dans un explain).

    2. VALIDER_CLIENT doit prendre sans doute 2 ou 3 valeurs possible. Donc un simple table scan serait plus efficaces qu'un index dans la mesure où une valeur pourrais contenir plus de 30 % des lignes de la tables.

    Essayer de faire un explain de la requettes pour vérifier ce qui se passe
    Olivier Miossec

  8. #8
    Membre confirmé
    Avatar de omiossec
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2002
    Messages : 241
    Points : 563
    Points
    563
    Par défaut
    Citation Envoyé par Kijer Voir le message
    déjà le cas c'est ça le pire..

    Edit : une clef primaire (PRIMARY) est bien un index ? ou faut clef primaire + INDEX
    Une clé primaire est un index NOT NULL UNIQUE INDEX
    Olivier Miossec

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Points : 45
    Points
    45
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    id 	1
    select_type 	SIMPLE 	
    table 	client 	
    type 	range 	
    possible_keys 	valider_client
    key 	valider_client
    key_len 	1
    ref 	NULL 	
    rows 	2004289 	
    Extra      Using where; Using filesort

  10. #10
    Membre confirmé
    Avatar de omiossec
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2002
    Messages : 241
    Points : 563
    Points
    563
    Par défaut
    Il faudrait supprimer l'index sur valider_client cela devrais permetre à MySql de mieux utiliser l'index sur ID_CLIENT pour le trie.
    Olivier Miossec

  11. #11
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Très bien, au temps pour moi. Je pensais que du fait que c'était trié par 'VALIDER_CLIENT', puis par 'ID_CLIENT' pour chaque valeur de 'VALIDER_CLIENT', cela permettrait de se passer du tri une fois une valeur de 'VALIDER_CLIENT' choisie.
    Merci pour cette information
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Points : 45
    Points
    45
    Par défaut
    J'ai un soucis, si j'enleve valider_client, pour une autre requete de la page (qui compte le nombre de clients validés), cette requete tarde a s'executer.

    Sinon comme vous dites sur la requete des 5 derniers s'execute bcp plus rapidement en supprimant l'index sur valider.

    Une fois ce constat fait j'ai décidé de remettre la requete entière avec les 7 JOIN comme dans monpremier message, mais ca ramme toujours autant...

  13. #13
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Rien ne t'empeche de créer un autre index avec uniquement comme clé 'VALIDER_CLIENT'. Faut juste garder en tete que plus il y a d'index, plus les insertions/maj sont longues.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 96
    Points : 45
    Points
    45
    Par défaut
    il n'etait pas ensemble ! il etait séparé.

Discussions similaires

  1. REQUETE multi jointure
    Par olive_olive dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/02/2011, 23h43
  2. optimisation d'une requete de jointure multiple
    Par M_Dandouna dans le forum SQL
    Réponses: 17
    Dernier message: 02/01/2008, 21h54
  3. Besoin d'aide sur une requete avec jointure et MAX()
    Par droog dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/07/2007, 18h23
  4. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 27
    Dernier message: 06/01/2006, 15h50
  5. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/01/2006, 19h39

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