In realtà non è tanto così. Le 100.000 righe sono già considerando le tabelle separate.
Poi avevo già usato una struttura del tipo SELECT * FROM WHERE RicettaID IN (SELECT DISTINCT RicettaID FROM ...)
Ti assicuro che anche con meno record mi mandava in time out.

Adesso ho qualcosa del tipo
SELECT * FROM WHERE RicettaID = 1 or RicettaID = 2, ma per popolare il WHERE devo fare una chiamata al DB. Con questo numero di record funziona, ma se si passasse, come penso, a 10 volte tanto non so se la cosa potrebbe ancora funzionare.

Senza contare che ho 3 casi di ingrediente da selezionare e altrettanti di ingredienti da eliminare. Posso ridurre le opzioni alla peggio, ma prima di farlo volevo essere sicura che non ci fossero soluzioni alternative. Da qui l'idea di splittare la tabella originale