Quando hai sia LIMIT che ORDER BY, l'ottimizzatore ha deciso che è più veloce zoppicare attraverso i record non filtrati su foo con una chiave discendente finché non ottiene cinque corrispondenze per il resto dei criteri. Negli altri casi, esegue semplicemente la query come un ciclo nidificato e restituisce tutti i record.
A prima vista, direi che il problema è che PG non grok il giunto distribuzione dei vari ID ed è per questo che il piano non è ottimale.
Per le possibili soluzioni:presumo che tu abbia eseguito ANALYZE di recente. In caso contrario, fallo. Questo potrebbe spiegare perché i tuoi tempi stimati sono alti anche sulla versione che ritorna velocemente. Se il problema persiste, forse eseguire ORDER BY come sottoselezione e inserire LIMIT in una query esterna.