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 :

Optimisation requete SQL


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Optimisation requete SQL
    Bonjour,

    J'aimerai avoir votre aide pour optimiser une requête SQL.

    Voici le problème dans mes logs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # Query_time: 61  Lock_time: 0  Rows_sent: 30  Rows_examined: 13128
    SELECT u.username, u.user_id, u.user_posts, u.user_from, u.user_website, u.user_email, u.user_icq, u.user_aim, u.user_yim, u.user_regdate, u.user_msnm, u.user_viewemail, u.user_rank, u.user_sig, u.user_sig_bbcode_uid, u.user_avatar, u.user_avatar_type, u.user_allowavatar, u.user_allowsmile, u.user_points, u.user_warnings, u.user_level, u.user_gender, u.user_element , u.user_klass , u.user_race , u.user_alignment, p.*,  pt.post_text, pt.post_subject, pt.bbcode_uid
            FROM phpbb_posts p, phpbb_users u, phpbb_posts_text pt
            WHERE p.forumid = 4708
        AND u.forumid = 4708
        AND pt.forumid = 4708
        AND p.topic_id = 2
    
                    AND pt.post_id = p.post_id
                    AND u.user_id = p.poster_id
            ORDER BY p.post_time ASC
            LIMIT 0, 30;
    
    Avec la table :
    phpbb_posts
    
    Nom de la clé 	 	Type 	Cardinalité  	 	 Champ
    PRIMARY 	 	PRIMARY 	622968 	 	post_id  forumid
    forum_id 	 	INDEX 	 	524  	 	forum_id
    topic_id 	 	INDEX 	 	103828  	topic_id
    poster_id 	 	INDEX 	 	187  	 	poster_id
    post_time 	 	INDEX 	 	622968  	post_time
    post_id 	 	INDEX 	 	622968  	post_id
    
    Table phpbb_users
    Nom de la clé  	 	 	Type  	 	Cardinalité    	 	Champ
    PRIMARY 	 	 	PRIMARY 	52860   	 user_id forumid
    user_session_time 	 	INDEX 	 	52860  	 	user_session_time
    user_id 	 	 	INDEX 	 	 	61  	 	user_id
    forumid 	 	 	INDEX 	 	 	26430  	 	forumid
    
    Table phpbb_post_text
     PRIMARY  	  	PRIMARY  	913565   	post_id & forumid
    post_id 	 	INDEX 	 	 	913565  	post_id
    forumid 	 	INDEX 	 	 	12180  	 	forumid
    Ais je bien les bons index ? N'y en a t'il pas trop ?
    Pourquoi cette requête est elle si longue ?

    Voici ce que me retourne un explain
    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 	pt 	ref 	PRIMARY,post_id,forumid 	forumid 	4 	const 	3294 	Using temporary; Using filesort
    1 	SIMPLE 	p 	eq_ref 	PRIMARY,topic_id,poster_id,post_id 	PRIMARY 	7 	monforum.pt.post_id,const 	1 	Using where
    1 	SIMPLE 	u 	eq_ref 	PRIMARY,user_id,forumid 	PRIMARY 	7 	monforum.p.poster_id,const 	1

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Il y a t'il une personne qui a une idée ? merci

  3. #3
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Je ne sais pas trop t'aider mais tu peux essayer quand même ceci :

    - Faire des jointures "propres" avec JOIN

    - Tenter un OPTIMIZE TABLE (dans ton cas, je doute que ça serve)

    - Faire un "ORDER BY post_id" si l'id d'un post est toujours supérieur aux autres posts plus anciens. Là aussi, vu les index, je doute que ça soit utile !

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

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par compu
    N'y en a t'il pas trop ?
    Un index relentie les INSERT et prend de la place donc je ne pense pas qu'il y en ait trop, du moins pour ce SELECT

    Citation Envoyé par compu
    Ais je bien les bons index ?
    Ca n'a pas l'air mal. Pour accélérer cette requête des index sur deux champs pourraient aider (par ex pt.post_id et pt.forumid) mais est-ce que ça vaut le peine si c'est pour une seule requête ?

    Sinon passer par des JOIN comme le suggère Biglo. Peut-être en partant de phpbb_users car elle a la cardinalité la plus faible. Il faudrait voir en utilisant 'ON (u.forumid = 4708 AND u.user_id = p.poster_id)' ou en mettant 'u.forumid = 4708' dans le WHERE ce qui passe le mieux.

    Citation Envoyé par compu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WHERE p.forumid = 4708
        AND u.forumid = 4708
        AND pt.forumid = 4708
    Je suppose que c'est une redondance. Est-ce que ça fait gagner ou perdre du temps ?

    Un dernier truc que je voie à vérifier est la taille du cache des index (key_buffer_size). Ils doivent être très gros (et ils sont nombreux) alors il faudrait vérifier que leur cache permet de les avoir en RAM car presque toute la requête se fait aux index, donc s'il sont dans le cache ça devrait aller vite. "show status like 'key%';" pour surveiller que le cache est bien utilisé.

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

Discussions similaires

  1. Optimisation requete SQL - exo
    Par Margatthieu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/04/2008, 08h54
  2. Optimisation requete SQL ,plusieurs jointure ?
    Par mamiberkof dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/02/2008, 16h39
  3. optimisation requete SQL
    Par lepierot dans le forum SQL
    Réponses: 20
    Dernier message: 13/09/2007, 15h47
  4. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52
  5. Optimisation requetes SQL
    Par joel90 dans le forum Administration
    Réponses: 18
    Dernier message: 15/05/2004, 21h45

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