Lorsque vous avez à la fois LIMIT et ORDER BY, l'optimiseur a décidé qu'il est plus rapide de parcourir les enregistrements non filtrés sur foo par clé décroissante jusqu'à ce qu'il obtienne cinq correspondances pour le reste des critères. Dans les autres cas, il exécute simplement la requête comme une boucle imbriquée et renvoie tous les enregistrements.
Au désinvolte, je dirais que le problème est que PG ne grignote pas le joint répartition des différents identifiants et c'est pourquoi le plan est si sous-optimal.
Pour les solutions possibles :je suppose que vous avez récemment exécuté ANALYZE. Sinon, faites-le. Cela peut expliquer pourquoi vos temps estimés sont élevés même sur la version qui revient rapidement. Si le problème persiste, exécutez peut-être ORDER BY en tant que sous-sélection et appuyez sur LIMIT dans une requête externe.