J'ai une requête simple (postgresql si cela compte) qui récupère tous les articles d'un utilisateur, à l'exception de ceux qui figurent sur sa liste de souhaits. :
select i.*
from core_item i
left outer join core_item_in_basket b on (i.id=b.item_id and b.user_id=__some_user__)
where b.on_wishlist is null;
La requête ci-dessus s'exécute en ~50000ms (oui, le chiffre est correct). Si je supprime la condition "b.on_wishlist is null" ou si je la transforme en "b.on_wishlist is not null", la requête s'exécute en 50 ms environ (un sacré changement).
La requête comporte d'autres jointures et conditions, mais cela n'a pas d'importance car seule celle-ci ralentit la requête.
Quelques informations sur la taille de la base de données :
- core_items a ~ 10.000 enregistrements
- core_user a ~5.000 enregistrements
- core_item_in_basket a ~2.000
- (dont environ 50 % ont on_wishlist = true, le reste est nul).
Je n'ai pas d'index (sauf pour les identifiants et les clés étrangères) sur ces deux tables.
La question est la suivante : que dois-je faire pour que ça aille plus vite ? J'ai moi-même quelques idées à vérifier ce soir, mais j'aimerais que vous m'aidiez aussi, si possible.
Merci !