Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1464 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  MySQL - Optimisation d'une requête avec plusieurs JOIN

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

MySQL - Optimisation d'une requête avec plusieurs JOIN

n°1593049
b4ckUp
263 §
Posté le 29-07-2007 à 21:40:12  profilanswer
 

Salut,  
 
Je suis en train d'optimiser mes requêtes MySQL sur ma base de données parce que c'est plutôt inacceptable d'avoir des requêtes qui mettent plus de 30s à s'executer.  
 
Mais là j'ai un petit souci :

Code :
  1. SELECT SQL_CALC_FOUND_ROWS i.*, DATE_FORMAT(i.date, '%d-%m-%y') as date, u.login
  2. FROM img i
  3. LEFT JOIN users u ON u.id=i.userid
  4. LEFT JOIN flags f ON f.imgid=i.id AND f.userid=474
  5. WHERE i.deleted=0
  6. AND f.userid IS NULL
  7. GROUP BY i.id
  8. ORDER BY i.id DESC LIMIT 0,12;


 
Cette requête met environ 1 sec à s'executer ce qui je trouve est encore lent... En faisant un EXPLAIN je vois que MySQL doit examiner environ 28k lignes. Le seul souci c'est que je vois pas vraiment ce que je dois changer pour faire tomber le record.
 
Si quelqu'un à une idée, ça serait gentil :)
 
Oui, je sais le i.* c'est le mal, mais j'ai besoin de tout (ou presque). Et sinon le SQL_CALC_FOUND_ROWS c'est une petite commande très pratique qui permet de connaitre le nombre de résultats sans tenir compte du LIMIT. (Donc j'évite de faire un mysql_num_rows ou l'utilisation d'une seconde requête avec un COUNT).
 
Mais la vraie méchante requête c'est celle-ci :

Code :
  1. EXPLAIN SELECT SQL_CALC_FOUND_ROWS i.*, DATE_FORMAT(i.date, '%d-%m-%y') as date, u.login
  2. FROM img i
  3. LEFT JOIN comments c ON c.imgid=i.id
  4. LEFT JOIN users u ON u.id=i.userid 
  5. LEFT JOIN flags f ON i.id=f.imgid
  6. WHERE i.deleted=0
  7. AND c.date > f.lastview
  8. AND c.userid!=530
  9. AND f.userid=530
  10. GROUP BY i.id ORDER BY i.id DESC LIMIT 0,12


 
Là le explain sort qu'il doit chercher dans 500k à 1,3M (en fonction de l'userid et donc du nombre d'enregistrements dans "flags" ) et je vois pas comment faire autrement... (et là c'est toujours au mini 3 sec sur un serveur qui fait rien à part mes petites requêtes de tests toutes les 30s, donc sur le serveur MySQL en production à raison de 10 à 20 requêtes de ce genre/sec on fait vite grimper le score...)  :fou:  
PS: merci MagicBuzz d'avoir répondu à ma question ici : http://forum.hardware.fr/hfr/Progr [...] 6416_2.htm


Message édité par b4ckUp le 30-07-2007 à 01:39:19
mood
Publicité
Posté le 29-07-2007 à 21:40:12  profilanswer
 

n°1593933
b4ckUp
263 §
Posté le 31-07-2007 à 18:23:24  profilanswer
 

nan sérieux, y'a personne ?
J'galère vraiment et c'est plutôt important :x


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  MySQL - Optimisation d'une requête avec plusieurs JOIN

 

Sujets relatifs
[MYSQL] Requete complexe[MySQL] Un sort un peu spécial
[Résolu] MySql : Dernière entrée qui apparait en premier?[MySQL] Insert + sous requete
[SQL] Problème avec une petite requête et un DISTINCT.Synchroniser table access et serveur Mysql
Comparaison de mot de passe mysql/php[RESOLU] MySQL jointure sur clé primaire LENTE
Plus de sujets relatifs à : MySQL - Optimisation d'une requête avec plusieurs JOIN


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR