Optimiser une requete MySQL
14 messages • Page 1 sur 1
Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics
Optimiser une requete MySQL
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.
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

- Messages: 203
- Inscription: Mer Oct 29, 2003 11:32
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).
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"
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

- Messages: 203
- Inscription: Mer Oct 29, 2003 11: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
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
-

Pulsar-san - WRInaute occasionnel

- Messages: 203
- Inscription: Mer Oct 29, 2003 11:32
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
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
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
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
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
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
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.
- 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é

- Messages: 872
- Inscription: Dim Aoû 01, 2004 0:08
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)
(en changeant les noms des tables si t'as peur de les dévoiler)
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.
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.
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...
Il est vrai que le temps de réponse sera nettement meilleur.
Depuis hier j'ai en tout cas plus aucune slow-query...
14 messages • Page 1 sur 1
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 :
- Google API : guide de développement de l'API Google
- Gestion des langues et des sessions en PHP / MySQL
- Nombre moyen de mots par requête : statistiques AOL Août 2006
- Nombre de clics dans les pages de résultats : statistiques AOL Août 2006
- Passage à l'heure d'été/hiver sur un forum phpBB
- GoogleStats : analyse temps réel des visites de Google sur votre site
- Informations sur l'infrastructure technique de Google
- Sortie officielle de GoogleStats v2.0 !
- Google indexe le Flash
- AdSense Tracking : statistiques détaillées sur les clics AdSense
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités





le forum