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
Message édité par b4ckUp le 30-07-2007 à 01:39:19