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 :

Temps d'execution d'une requête


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Par défaut Temps d'execution d'une requête
    Bonjour,
    je rencontre des problèmes de ralentissements avec mes requêtes et je ne comprend pas vraiment pourquoi, voici ma requête: (j'obtiens une liste de news à afficher).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT n.*, u.email, u.login, c.categorie_name AS categorie 
    FROM news n 
    INNER JOIN user u ON u.id_user = n.id_user 
    INNER JOIN news_categorie c ON c.id_news_categorie = n.id_category 
    ORDER BY n.id_news DESC LIMIT 0,20
    Durée d'exécution : 0.4515s. (en moyenne), pendant que certaines requêtes plus petites s'exécutent en 0.0004s. à côté.
    Du coup je passe de 0.0096s. à 0.4611s. de chargement :/

    J'ai essayé de comprendre pourquoi et apparemment il se pourrait que ce soit aussi dû à un problème d'index dans mes tables, mais comme là dedans je n'y comprends rien, j'ai du mal à faire quoi que ce soit

    Voilà une capture d'image de mes trois tables concernées, si ça peut aider :
    Table news
    Table news_categorie
    Table user

    Je le rappelle je ne m'y connais pas du tout sur les champs à mettre en index et les clés machins, donc si en plus d'avoir la gentillesse de me répondre vous auriez la gentillesse de faire une réponse assez simple et clair pour moi je vous en remercierai très chaleureusement

    Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Par défaut
    salut! est-ce que tu pourrais faire un explain de ta requete pour qu'on voit comment mysql effectue les jointures?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Par défaut
    Oui, voilà ce que ça me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
    1 	SIMPLE 		c 	ALL 	id_news 	NULL 	NULL 		NULL 	3 	Using temporary; Using filesort
    1 	SIMPLE 		n 	ALL 	NULL 		NULL 	NULL 		NULL 	6 	Using where
    1 	SIMPLE 		u 	eq_ref 	PRIMARY 	PRIMARY 4 	bdd.n.id_user 	1

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Par défaut
    Mysql n'effectue pas les jointures dans le sens ou tu les as mises.Je pense que tu vas avoir soit besoin de créer un index sur la table news pour la colonne id_category, soit indiquer a mysql de respecter le sens de tes jointures en rajoutant la clause straight_join dans ta requete. Le problème vient du fait qu'il y a moins d'enregistrements dans ta table catégorie que dans les deux autres, mysql privilégie donc cette table comme point de départ.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Par défaut
    Je viens d'essayer en ajoutant un STRAIGHT_JOIN mais je n'observe aucune, ou bien très légère, différence.
    J'ai aussi rajouter une clé de type index sur mon champ id_category de ma table news mais je n'ai pas vu non plus de réel différence
    J'ai peut-être mal fait quelque chose je ne sais pas. Merci de ton aide en tout cas.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Est-ce que les tables sont déjà bien remplies ? Sur les captures d'écran elles ont l'air très petites. Ca pourrait influer sur les choix de mysql et les performances (expliquer qu'il y a peu de différence entre les différentes approches).

    Sinon utiliser des "LEFT JOIN" pourrait inciter mysql à applique le LIMIT immédiatement (même si en général on tente d'éviter les jointures ouvertes inutiles).

    Si la version de mysql le permet peut-être même viser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT n.*, u.email, u.login, c.categorie_name AS categorie 
    FROM (SELECT *
          FROM news
          ORDER BY n.id_news DESC LIMIT 0,20) AS n
    INNER JOIN user u ON u.id_user = n.id_user 
    INNER JOIN news_categorie c ON c.id_news_categorie = n.id_category
    ORDER BY n.id_news

    Accessoirement il serait probablement utile (mais pas forcément pour cette requête) d'indexer news.id_user et news.id_category. En général les champs qui font référence à d'autre tables sont de bons candidats pour les indexes.

Discussions similaires

  1. Alléger le temps d'execution d'une requête
    Par tiffany dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/12/2010, 22h11
  2. Recuperer le temps d'execution d'une requête
    Par chris0938 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 24/06/2010, 16h10
  3. Temps d'execution d'une requête
    Par chris_013 dans le forum PL/SQL
    Réponses: 6
    Dernier message: 10/12/2008, 08h53
  4. Réponses: 1
    Dernier message: 25/06/2007, 09h35
  5. Temps d'execution d'une requête
    Par Maglight dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/01/2005, 08h38

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