Is Laravel Slow? Optimize Queries & Indexes for Maximum Performance
July 20, 2025A detailed, example-rich guide to avoid slowdowns in Laravel apps by optimizing data retrieval and employing indexing smartly.
1. 🧠 Fetch Only What You Need
Loading every column and row with DB::table('users')->get()
can clog resources. Instead:
$users = DB::table('users')
->select('id', 'name', 'email')
->where('status', 'active')
->limit(50)
->get();
With Eloquent:
$users = User::select('id','name','email')
->where('status','active')
->take(50)
->get();
Why? Less memory, fewer bytes transferred, faster response times.
2. 🔑 Leverage Database Indexing
If filtering on columns like customer_id
or status
, adding indexes speeds up searches:
Schema::table('orders', function (Blueprint $table) {
$table->index('customer_id');
$table->index(['status', 'created_at']); // composite index
});
Run php artisan migrate
to apply. Only add indexes where they help in WHERE
, JOIN
, or ORDER BY
. Avoid over-indexing to prevent slow writes.
3. 🛠️ Profile and Debug Queries
During development:
DB::enableQueryLog();
// run query then:
dd(DB::getQueryLog());
Try tools like Laravel Debugbar
or Telescope
, or run raw SQL with EXPLAIN
to verify index use:
EXPLAIN SELECT * FROM orders WHERE customer_id = 5;
4. ✅ Checklist for Fast Laravel Queries
- Select only fields you need (
select()
). - Limit rows with
limit()
ortake()
. - Add proper indexes on WHERE/JOIN columns.
- Profile with Debugbar/Telescope.
- Avoid loading unused relationships (prevent N+1 queries).
5. ✨ Advanced Tips & Bonus Tricks
Eager vs Lazy Loading: Use with()
to avoid N+1:
$posts = Post::with('comments')->get();
Chunking big datasets:
Post::chunk(100, function($posts) {
foreach ($posts as $post) {
// process...
}
});
Cache heavy queries:
$posts = Cache::remember('all_posts', 60, function() {
return Post::with('comments')->get();
});
Use raw SQL when needed:
$rows = DB::select('SELECT * FROM orders WHERE status = ?', ['active']);
Monitor: Log every query:
DB::listen(function($query){
Log::info("SQL: {$query->sql} - Bindings: " . implode(',', $query->bindings) . " - Time: {$query->time}ms");
});
6. 🚀 Scale & Optimize Further
- Enable
OPcache
in PHP. - Use
php artisan config:cache
androute:cache
. - Pick fast cache stores (Redis, Memcached).
- Consider horizontal scaling (multiple servers).
- Profile regularly; optimize early and often.
By writing precise queries, indexing smartly, and profiling well, your Laravel app will stay fast and scalable. Performance starts at your queries.
Blog
CSS Specificity: Layers vs BEM vs Utility Classes
Jun 26, 2025
CSS Specificity: Cascade Layers vs BEM vs Utility Classes This article compares three approaches to managing CSS specificity — BEM, utility‑f...
Guide to Scroll‑Driven Animations with CSS
Jun 26, 2025
Guide to Scroll‑Driven Animations with CSS CSS animations can now be linked to user scrolling without any JavaScript — just pure CSS. 1. Thr...
Mastering Laravel Context: Advanced Logging and Contextual Job Tracing
Jul 20, 2025
Laravel Context is one of the most powerful new features in Laravel 12. It allows you to attach contextual data (like user ID, IP address, request pat...
Supercharge Your PHP Enums with archtechx/enums
Jul 01, 2025
Supercharge Your PHP Enums with archtechx/enums PHP 8.1 introduced native enums—type‑safe sets of named values like statuses or roles. The arch...
Essential React Native UI & Interaction Components
Jul 01, 2025
Essential React Native UI & Interaction Components React Native provides a powerful set of built-in components for creating native mobile apps....
ECMAScript 2025 Detailed Update Guide for Frontend Developers
Jul 06, 2025
🔍 ECMAScript 2025 – Detailed Feature Guide All new ECMAScript 2025 features with code examples and explanation of their importance for front...
