Let me analyze this systematically. First, let's see what execution plan you're getting. Can you share the EXPLAIN ANALYZE output? I need to see whether it's using indexes, where the time is being spent, and join strategy.
While you get that, I spot THREE likely issues:
1. No index on orders.created_at - this forces a sequential scan
2. LEFT JOIN plus WHERE on the right table - this acts like an INNER JOIN but slower
3. No index on orders.user_id - the join is probably doing nested loops