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

MySQL - Optimisation d'une requête avec plusieurs JOIN - SQL/NoSQL - Programmation

Marsh Posté le 29-07-2007 à 21:40:12    

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
Reply

Marsh Posté le 29-07-2007 à 21:40:12   

Reply

Marsh Posté le 31-07-2007 à 18:23:24    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed