Wenn Sie sowohl LIMIT als auch ORDER BY haben, hat der Optimierer entschieden, dass es schneller ist, die ungefilterten Datensätze auf foo mit absteigendem Schlüssel zu durchlaufen, bis er fünf Übereinstimmungen für die restlichen Kriterien erhält. In den anderen Fällen führt es die Abfrage einfach als verschachtelte Schleife aus und gibt alle Datensätze zurück.
Beiläufig würde ich sagen, das Problem ist, dass PG den Joint nicht grokt Verteilung der verschiedenen IDs und deshalb ist der Plan so suboptimal.
Für mögliche Lösungen:Ich gehe davon aus, dass Sie ANALYZE kürzlich ausgeführt haben. Wenn nicht, tun Sie dies. Das kann erklären, warum Ihre geschätzten Zeiten selbst bei der Version, die schnell zurückkehrt, hoch sind. Wenn das Problem weiterhin besteht, führen Sie vielleicht ORDER BY als Unterauswahl aus und setzen Sie LIMIT in einer äußeren Abfrage ein.