Idź i zdobądź 20 najlepszych. Jeśli nie spełniają wymagań, wykonaj dodatkowe zapytanie, aby znaleźć brakujące elementy. Powinieneś być w stanie wymyślić pewną równowagę między liczbą zapytań a liczbą wierszy, z których każdy zwraca.
Jeśli znalazłeś się w pierwszej setce, może ona spełniać wymagania w 90% przypadków i byłaby tańsza i szybsza niż 10 oddzielnych zapytań.
Gdyby to był SQL Server, mógłbym bardziej pomóc...
Właściwie mam inny pomysł. Uruchamiaj proces co 5 minut, który oblicza listę i buforuje ją w tabeli. Spraw, aby DML w powiązanych tabelach unieważnił pamięć podręczną, aby nie była używana do czasu ponownego wypełnienia (być może artykuł został usunięty). Jeśli pamięć podręczna jest nieprawidłowa, wrócisz do obliczania jej w locie... A mimo to mógłbyś użyć tego do ponownego zapełnienia pamięci podręcznej.
Możliwe jest strategiczne zaktualizowanie buforowanej listy zamiast ponownego jej obliczania. Ale to może być prawdziwym wyzwaniem.
Powinno to pomóc zarówno w szybkości zapytań, jak i zmniejszeniu obciążenia bazy danych. Nie powinno mieć większego znaczenia, jeśli lista artykułów jest nieaktualna o 5 minut. Cholera, nawet 1 minuta może zadziałać.