Surcharge BDD ?

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics

FlorentP
WRInaute discret
WRInaute discret
 
Messages: 145
Inscription: 25 Juin 2005

Message le Mar Nov 28, 2006 17:56

C'est quoi la requete et la structure des tables ?

RomsIW
WRInaute passionné
WRInaute passionné
 
Messages: 1126
Inscription: 25 Mai 2004

Message le Mar Nov 28, 2006 18:48

FlorentP a écrit:C'est quoi la requete et la structure des tables ?


ça tu l'auras deviné, c'est très confidentiel. Je suis désolé j'ai donné le maximum d'informations mais tout le monde n'a pas à savoir ce qui se trouve comme informations dans notre base de commandes.. si tu as des questions plus précises, je pourrai certainement te répondre.. :oops:

RomsIW
WRInaute passionné
WRInaute passionné
 
Messages: 1126
Inscription: 25 Mai 2004

Message le Mar Nov 28, 2006 18:49

julienr a écrit:tu peux essayer de demander à mysql d'ordonner physiquement tes lignes sur ta colonne date, mais je ne sais pas ce que cela vaut
comment fait-on ça ?

FlorentP
WRInaute discret
WRInaute discret
 
Messages: 145
Inscription: 25 Juin 2005

Message le Mar Nov 28, 2006 18:53

Si tu ne veux pas donner la vrai structure et la requete, modifie les noms et supprime tout ce qui ne sert à rien. Le but étant se savoir :
- où se trouvent tes index
- sur quels champs tu fais tes jointures

Parceque là clairement d'après ton explain, ya des gros soucis, ya une seul index utilisé sur 4 endroits où tu pourrait utilisé donc forcément c'est violent.

Sans ça, on peut pas t'aider, on peut juste te rediriger vers des cours sur mysql, tu trouvera ça facilement sur google

FlorentP
WRInaute discret
WRInaute discret
 
Messages: 145
Inscription: 25 Juin 2005

Message le Mar Nov 28, 2006 18:54

RomsIW a écrit:
julienr a écrit:tu peux essayer de demander à mysql d'ordonner physiquement tes lignes sur ta colonne date, mais je ne sais pas ce que cela vaut
comment fait-on ça ?

S'pas ça qui va optimiser tes jointures, ça ça peut servir pour économiser des balades inutiles de la tête de lecture sur le disque dûr, c'est un peu le dernier niveau d'optimisation, t'es encore loin de ça tant que t'as pas peaufiné tes jointures :p

RomsIW
WRInaute passionné
WRInaute passionné
 
Messages: 1126
Inscription: 25 Mai 2004

Message le Mar Nov 28, 2006 19:06

FlorentP a écrit:Si tu ne veux pas donner la vrai structure et la requete, modifie les noms et supprime tout ce qui ne sert à rien. Le but étant se savoir :
- où se trouvent tes index
- sur quels champs tu fais tes jointures

Parceque là clairement d'après ton explain, ya des gros soucis, ya une seul index utilisé sur 4 endroits où tu pourrait utilisé donc forcément c'est violent.

Sans ça, on peut pas t'aider, on peut juste te rediriger vers des cours sur mysql, tu trouvera ça facilement sur google


ok voici ce que je peux dire :

Code: Tout sélectionner
SELECT D.*, C.lettre, C.libelle, C.couleur, PC.tarif, F1.num AS num_facture_type1
FROM TABLE_COMMANDES AS D

LEFT JOIN TABLE_REL_PRODUITS_PAR_CENTRES AS PC ON PC.id_centre=D.id_centre AND PC.id_produit=D.type_saut
LEFT JOIN TABLE_CENTRES AS C ON C.id_centre=D.id_centre
LEFT JOIN TABLE_FACTURES AS F1 ON F1.id_cmd=D.id_cmd

WHERE D.etat<>'-1' ORDER BY D.date DESC LIMIT 0,20


à propos des index :

Code: Tout sélectionner
PRIMARY 5249   id
INDEX    5249 date

FlorentP
WRInaute discret
WRInaute discret
 
Messages: 145
Inscription: 25 Juin 2005

Message le Mar Nov 28, 2006 19:25

TABLE_CENTRES => il faut un index simple sur "id_centre" (même une primary key serait logique, y'en a pas déjà ?)
TABLE_FACTURES => idem sur "id_cmd"

TABLE_REL_PRODUITS_PAR_CENTRES => il faut un index composé, sur "id_centre, id_produit"
(ou "id_produit, id_centre" selon comment tu veux que cet index puisse resservir)

TABLE_COMMANDES => if faut un index sur "etat, date"

FlorentP
WRInaute discret
WRInaute discret
 
Messages: 145
Inscription: 25 Juin 2005

Message le Mar Nov 28, 2006 19:28

Note : SELECT D.*, c'est pas vraiment une bonne pratique, liste tes champs : "D.truc, D.machin, D.bidule..."

RomsIW
WRInaute passionné
WRInaute passionné
 
Messages: 1126
Inscription: 25 Mai 2004

Message le Mer Nov 29, 2006 8:22

FlorentP a écrit:TABLE_CENTRES => il faut un index simple sur "id_centre" (même une primary key serait logique, y'en a pas déjà ?)
TABLE_FACTURES => idem sur "id_cmd"

TABLE_REL_PRODUITS_PAR_CENTRES => il faut un index composé, sur "id_centre, id_produit"
(ou "id_produit, id_centre" selon comment tu veux que cet index puisse resservir)

TABLE_COMMANDES => if faut un index sur "etat, date"

TABLE_CENTRES il y a la PK évidemment
TABLE_FACTURES idem
TABLE_REL... comment fait on un index composé ?
TABLE_COMMANDES comment fait on un index sur "etat, date" ?

Pour le D.*, c'était pour raccourcir car il y a pas mal de champs sélectionnés et qu'il n'y a pas de champs intéressant à citer ici ;)

merci encore

FlorentP
WRInaute discret
WRInaute discret
 
Messages: 145
Inscription: 25 Juin 2005

Message le Mer Nov 29, 2006 17:12

C'est bizarre que tu dises qu'il y a une PK sur le champs parce que ton explain indique que la jointure n'utilise pas d'index :

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE D ALL NULL NULL NULL NULL 5234 Using where; Using temporary; Using filesort
1 SIMPLE PC ALL NULL NULL NULL NULL 69
1 SIMPLE C eq_ref PRIMARY PRIMARY 4 qgcom2.D.centre 1
1 SIMPLE F4 ALL NULL NULL NULL NULL 1050

=> Sur la table "C" il y a bien un index, nikel, le type est "eq_ref"
=> pour F4 par contre, le type est "ALL", c'est à dire qu'il n'y pas d'index, mysql scan toute le contenu de la table dans le disque dur => très lourd

Pour l'index simple :
ALTER TABLE t ADD INDEX (c)
Pour un index composé :
ALTER TABLE t ADD INDEX (c1,c2)

RomsIW
WRInaute passionné
WRInaute passionné
 
Messages: 1126
Inscription: 25 Mai 2004

Message le Jeu Nov 30, 2006 10:59

FlorentP a écrit:C'est bizarre que tu dises qu'il y a une PK sur le champs parce que ton explain indique que la jointure n'utilise pas d'index :

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE D ALL NULL NULL NULL NULL 5234 Using where; Using temporary; Using filesort
1 SIMPLE PC ALL NULL NULL NULL NULL 69
1 SIMPLE C eq_ref PRIMARY PRIMARY 4 qgcom2.D.centre 1
1 SIMPLE F4 ALL NULL NULL NULL NULL 1050

=> Sur la table "C" il y a bien un index, nikel, le type est "eq_ref"
=> pour F4 par contre, le type est "ALL", c'est à dire qu'il n'y pas d'index, mysql scan toute le contenu de la table dans le disque dur => très lourd

Pour l'index simple :
ALTER TABLE t ADD INDEX (c)
Pour un index composé :
ALTER TABLE t ADD INDEX (c1,c2)


J'ai réglé le pb de façon très simple :

j'ai limité la recherche à un certain nombre de résultats : "recherche parmi les X dernières commande (LAST_INSERT_ID - X)" et c'est devenu très rapide d'un coup :)

Merci !

Surcharge BDD ?

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par les experts Google Analytics de Ranking Metrics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités