UNION betyder UNION DISTINCT och detta är relativt långsamt eftersom det kommer att leta efter dubbletter även om det inte kommer att finnas några. Du vill ha UNION ALLA:
SELECT *, 0 AS head FROM foo WHERE id IN (1,2,3)
UNION ALL
SELECT *, 1 AS head FROM foo WHERE id NOT IN (1,2,3)
ORDER BY head, created_date
Jag kan föreställa mig att det efter denna förändring inte är mycket skillnad i prestanda mellan de tre frågorna. Det bästa sättet att vara säker är att mäta det.