billcom Posté 9 Avril 2013 Partager Posté 9 Avril 2013 Bonjour le hub, Je viens soliciter votre aide afin d'optimiser une requête MYSQL. J'ai une table1 (id1, champ1, champ11) qui est lié à la table2(id2, champ2, champ21, id1) J'aimerai effectcuer une requête qui va me récupérer les enregistrement de la table1 en effectuant un compte sur les id2 (count(id2)) répondant positivement à la jointure JOIN table2 on (table1.id1 = table2.id1) En fouillant un peu je suis arrivé à ce type de requête SELECT t1.id1, champ1, champ11, t2.nbElem FROM ( `table1` t1 ) LEFT JOIN (SELECT count(id2) as nbElem, id1 FROM table2 group by id1) as t2 ON (t1.`id1` = t2.`id2` ) GROUP BY t1.id1 LIMIT 10 Cette requête fonctionne mais ma table t2 possède 20 000 enregistrements donc à chaque execution de la requête mon serveur va effectuer "SELECT count(id2) as nbElem, id1 FROM table2 group by id1" sur les 20000 enregistrements avant de ne m'afficher que les 10 premier résultat souhaité signalé par le LIMIT 10. Soit en moyenne 15s par requête. Avez vous une idée? une solution pour accélérer ce traitement ? Merci de votre aide Lien vers le commentaire Partager sur d’autres sites More sharing options...
Solution Message populaire. jcaron Posté 9 Avril 2013 Solution Message populaire. Partager Posté 9 Avril 2013 Le premier point, c'est qu'il te faut absolument un index sur la colonne id1 de table2 (et plus si affinités...). Ensuite, tu devrais pouvoir simplifier ta requête comme ça: SELECT t1.id1, champ1, champ11, count(*) FROM table1 t1 LEFT JOIN table2 t2 ON (t1.id1=t2.id1) GROUP BY 1,2,3 ORDER BY whatever LIMIT 10 Non? Note qu'un LIMIT sans ORDER BY c'est complètement imprévisible. Jacques. 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
billcom Posté 10 Avril 2013 Auteur Partager Posté 10 Avril 2013 Salut jcaron tout d'abord merci pour ton aide. Il semblerai que l'ajout d'un index sur t2.id1 ai optimisé grandement la chose. J'ai également simplifié ma requête comme tu le suggère et tout semble fonctionner au top. J'ai simplement modifier le count(*) pour me limiter à un count(t2.id1) Affichage des lignes 100 - 99 ( 100 total, Traitement en 0.1608 sec) Je vais mettre tout ça en pratique Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant