Optimiser une requete MySQL

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 12:41

Optimiser une requete MySQL

Message le Lun Avr 18, 2005 22:57

J'ai une table avec disons 10 000 insertions et pas mal de champs.


Je voudrais retirer les 10 dernières insertions avec quelques conditions sur les champs.


J'ai essayé deux technique, une boucle en php décroissante qui s'arrete quand j'arrive à i=10 mais on m'a dit "tu es en train de faire une usine à gaz apprend à faire des requete"


J'ai alors fait une vrai requete sql, select * etc... Avec limit 0, 10, se qui me renvoit bien sur le meme résultat.


Cependant avant de me renvoyer le résultat toutes les insertions sont listés, en gros mysql examine les 10 000 insertions, se qui est très lent sachant que la table grossit de jour en jour.


Comment faire donc pour récuperer, sans tout parcourir et de façon optimisée, les 10 dernières insertions.


Pulsar-san
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 203
Inscription: Mer Oct 29, 2003 11:32

Message le Lun Avr 18, 2005 23:07

JeunZ a écrit:Cependant avant de me renvoyer le résultat toutes les insertions sont listés, en gros mysql examine les 10 000 insertions, se qui est très lent sachant que la table grossit de jour en jour.

Non, si tu mets limit 0,10 la requête s'arrête dès qu'elle a ses 10 éléments.
Maintenant, pour accélérer les choses, l'idéal est d'avoir un index par champ que tu utilises dans ta sélection (si tu as une clause WHERE).


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 12:41

Message le Lun Avr 18, 2005 23:11

Ba je fais bien un limite 0,10 mais dans mes "slow query" je retrouve toujours la requete avec 10 000 insertions examinées.


Ce serait alors parsqu'il part de 0 à 10 000 pour trouver les 10 derniers, comment faire pour qu'il parte de la fin, car en effet si on demande les 10 derniers et qu'on part du début.

edit: je met bien un "desc" et je classe sur mon champs "id"


Pulsar-san
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 203
Inscription: Mer Oct 29, 2003 11:32

Message le Lun Avr 18, 2005 23:32

Est-ce que ton champ "id" est un index ?
S'il ne l'est pas fais-en un index, ça devrait résoudre le problème.
http://dev.mysql.com/doc/mysql/en/limit-optimization.html


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 12:41

Message le Lun Avr 18, 2005 23:37

Il était en primary.


Pulsar-san
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 203
Inscription: Mer Oct 29, 2003 11:32

Message le Lun Avr 18, 2005 23:49

Hum... Tu me poses une colle.
Question: comment fais-tu pour voir tes Slow queries ?
Dans phpMyAdmin je vois que j'en ai 22, mais je ne sais pas comment faire pour les voir :?:


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 12:41

Message le Lun Avr 18, 2005 23:54

Euhhh je suis allé dans mon serveur dans le repertoire ou j'ai mes logs sql...


Depuis que j'ai transformé le primary en index je n'ai plus eu de nouvelle slow query donc je surveille ça à l'air d'avoir joué mais bon j'attend confirmation ;-)

merci en tout cas

Didier_S
WRInaute passionné
WRInaute passionné
 
Messages: 563
Inscription: Mar Aoû 24, 2004 22:25

Message le Mar Avr 19, 2005 3:52

si tu as d'autres champs qui se répettent (par exemple, l'identifiant d'un utilisateur qui ajoute un post dans un forum), tu peux aussi les passer en index, et optimiser (OPTIMIZE) ta table de temps à autre.
Avec cette technique, le serveur SQL ne lira que les lignes qui correspondent bien à l'utilisateur concerné.
plus d'infos par mp si tu veux, ou prends mon msn, je mords pas

pascal_
WRInaute discret
WRInaute discret
 
Messages: 97
Inscription: Ven Sep 24, 2004 13:57

Message le Mar Avr 19, 2005 8:49

Les 2 gros problèmes dans ce genre de requête :
- c'est les conditions de la requête ; une solution : mettre des index
- c'est le tri. Je suppose que pour rechercher les 10 dernieres lignes tu fais un truc genre ORDER BY no DESC LIMIT 0,10 . Il faut savoir qu'avec le ORDER BY mysql va regarder et classer les 10 000 enregistrements (c'est long), puis ensuite retrourner les 10 premiers éléments. Il n'y a pas de solution simple pour contourner ça.


cybervince
WRInaute passionné
WRInaute passionné
 
Messages: 872
Inscription: Dim Aoû 01, 2004 0:08

Message le Mar Avr 19, 2005 9:07

Tu veux pas nous faire un copier coller de ta requête ?
(en changeant les noms des tables si t'as peur de les dévoiler)


Blini
WRInaute passionné
WRInaute passionné
 
Messages: 506
Inscription: Lun Nov 29, 2004 8:59

Message le Mar Avr 19, 2005 9:12

Il y a des solutions. Après, ça dépend du genre de champ que tu manipules.
Typiquement, tu fais une petite table qui va garder trace des 10 derniers inserts: quand tu insères un nouveau record dans ta table principale, tu insères aussi ton fameux champ dans la petite table, avec un auto-increment.
Ensuite quand tu veux récupérer les 10 derniers records de ta table principale, tu croises simplement avec la petite table et ça t'évite le order by sur 10 000 records.
En clair: la petite table PETITE contient un auto-increment (AUTOID) et une copie de ton fameux champ (FAMFIELD). Donc à chaque insert sur ta table principale:
insert TABLEPRINC values(FAMFIELD, le_reste_des_champs)
insert PETITE values(FAMFIELD)
Récupères alors la valeur correspondante de l'auto-increment et tu fais:
delete from PETITE where AUTOID < (lastvalue-10)
pour virer les lignes trop anciennes.

Enfin, pour récupérer tes 10 derniers records:
select TABLEPRINC.* from TABLEPRINC, PETITE where PETITE.FAMFIELD = TABLEPRINC.FAMFIELD

Pas sûr d'être très clair, mais grosso modo, c'est l'idée.


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 12:41

Message le Mar Avr 19, 2005 12:32

Blini ))> Mon admin serveur qui a mis le nez dans mes requetes l'autre jour m'a dit la même chose "Mauvais système changer système" et il m'a dit de passer par une autre table ou je metterai que les 10 derniers...

Il est vrai que le temps de réponse sera nettement meilleur.


Depuis hier j'ai en tout cas plus aucune slow-query...


Blini
WRInaute passionné
WRInaute passionné
 
Messages: 506
Inscription: Lun Nov 29, 2004 8:59

Message le Mar Avr 19, 2005 12:57

Je suis très con, c'est effectivement encore plus simple de dupliquer complètement (= tous les champs) les 10 derniers records dans la petite table... Ça évitera la jointure


JeunZ
WRInaute accro
WRInaute accro
 
Messages: 5301
Inscription: Mer Fév 18, 2004 12:41

Message le Mar Avr 19, 2005 13:01

Et meme mieux au lieu de dupliquer tous les champs, je duplique que ceux qui me sont nécessaires ;-)

Je vais essayer de faire ça cette aprem merci à tous :-)


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 Julien Coquet, expert certifié officiellement par Google Analytics.

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