MySQL - Optimisation d'une requête avec plusieurs JOIN
MySQL - Optimisation d'une requête avec plusieurs JOIN - SQL/NoSQL - Programmation
MarshPosté 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 :
SELECT SQL_CALC_FOUND_ROWS i.*, DATE_FORMAT(i.date, '%d-%m-%y') as date, u.login
FROM img i
LEFT JOIN users u ON u.id=i.userid
LEFT JOIN flags f ON f.imgid=i.id AND f.userid=474
WHERE i.deleted=0
AND f.userid IS NULL
GROUP BY i.id
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 :
EXPLAIN SELECT SQL_CALC_FOUND_ROWS i.*, DATE_FORMAT(i.date, '%d-%m-%y') as date, u.login
FROM img i
LEFT JOIN comments c ON c.imgid=i.id
LEFT JOIN users u ON u.id=i.userid
LEFT JOIN flags f ON i.id=f.imgid
WHERE i.deleted=0
AND c.date > f.lastview
AND c.userid!=530
AND f.userid=530
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...) PS: merci MagicBuzz d'avoir répondu à ma question ici : http://forum.hardware.fr/hfr/Progr [...] 6416_2.htm
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 :
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 :
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...)
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