We recently completed a performance audit across 12 production Laravel applications ranging from small SaaS products to high-traffic e-commerce platforms. The same bottlenecks appeared in almost every codebase. Here's what we found and how we fixed it.

N+1 Queries Are Still the Biggest Culprit

Despite Eloquent's eager loading being well-documented, N+1 query problems remain the most common performance issue by a wide margin. In one case, a dashboard page was executing 340 queries to render 30 rows of data. Laravel Debugbar in development and Telescope in staging will show you exactly where these occur. The fix is almost always ->with(['relation', 'nested.relation']) added to your query.

Enable query logging temporarily in staging: DB::listen(fn($q) => logger($q->sql)) and look for repeated queries with only a changing WHERE clause.

Cache Your Computed Data

Dashboard metrics, aggregate counts, and any value that's expensive to compute but doesn't need to be real-time should be cached. Laravel's cache layer with Redis is fast and flexible. A pattern we use frequently: Cache::remember('key', 300, fn() => expensiveQuery()). Use cache tags when you need targeted invalidation.

Queue Everything That's Not Instant

Email sending, PDF generation, third-party API calls, image resizing — all of these should be pushed to a queue rather than handled synchronously in a request. A 200ms web request with a queued job is a far better UX than a 3-second response. Laravel Horizon makes queue monitoring and configuration clean and visual.

Database Indexing Is Free Performance

Audit your slow query log. Add indexes on columns used in WHERE, ORDER BY, and JOIN clauses. For composite queries, composite indexes often outperform single-column indexes. One client saw a 15x speedup on their main listing query from a single added composite index.

Laravel 11-Specific Wins

Laravel 11's slim skeleton reduces default middleware overhead. Review your middleware stack and remove anything you're not using. The new per-route middleware assignment is more granular than the old kernel approach — take advantage of it to avoid running heavy middleware on lightweight endpoints.