Logo
Backend Dec 17, 2025

Database Performance Optimization

KN
Kiro Nagy
Full Stack Developer
Kiro Nagy - Database Performance Optimization - Blog article

🔍 Introduction: Why Does This Problem Exist in the First Place?

Let’s imagine this scenario together 🤔
You have an application that works fine, the code is clean, and the idea is solid…
But users keep complaining that the website is slow.

You check the performance metrics and see:

😢 High response time
😢 Terrifying database load

The truth?
In most cases, the problem isn’t the code — it’s the database.

📊 Quick Stats:

  • 53% of users leave a website if it takes more than 3 seconds to load

  • More than 80% of page load time is caused by database queries

So if the database is slow → the entire application is slow.


📊 Part One: Why Are Queries Slow?

❌ Problem #1: The N+1 Query Problem

Imagine going to the market and buying one item per trip
Instead of writing a list and finishing everything at once.

That’s exactly what happens with N+1.

Wrong (very common) code:

$posts = Post::all(); // Query 1
foreach ($posts as $post) {
    echo $post->user->name; // N additional queries
}

📉 Result:
100 posts = 101 queries 😱

Correct solution – Eager Loading:

$posts = Post::with('user')->get();
foreach ($posts as $post) {
    echo $post->user->name;
}

📈 Result:
Only 2 queries 🎉
More than 50x improvement!


❌ Problem #2: Using SELECT *

// Wrong
$users = User::all();

// Correct
$users = User::select('id', 'name', 'email')->get();

Selecting all columns means:

  • More memory usage

  • Higher network load

  • Worse performance

Especially when the table is large.


❌ Problem #3: Not Using Indexes

Without an index:

SELECT * FROM users WHERE email = 'user@example.com';

With an index:

CREATE INDEX idx_email ON users(email);

📌 Indexes convert searching from:

  • Full table scan ❌
    to

  • Direct lookup ✅


💾 Part Two: Caching Strategies

🔥 Why Is Caching Important?

Caching means storing frequently requested data in a faster place than the database.

Instead of going to the kitchen 50 times…
Keep the cup next to you 😉


✅ Strategy #1: Query Caching

$categories = Cache::remember('categories', 60, function () {
    return Category::all();
});

📊 If you have 10,000 requests per hour:

  • Without cache: 10,000 queries ❌

  • With cache: only 60 queries ✅

🔥 99.4% load reduction


⚡ Strategy #2: Redis

Redis::set('user:1:profile', json_encode($user), 'EX', 3600);

$userProfile = Redis::get('user:1:profile');

if (!$userProfile) {
    $userProfile = User::find(1);
    Redis::set('user:1:profile', json_encode($userProfile), 'EX', 3600);
}

⏱️ Speed comparison:

  • Database: 50–100ms

  • Redis: 1–2ms

🚀 Up to 50x faster


🖼️ Strategy #3: View / Response Caching

$topProducts = Cache::remember('top_products', 3600, function () {
    return Product::with('category')
        ->orderBy('rating', 'desc')
        ->limit(10)
        ->get();
});

Instead of:
Request → DB → Render → Response ❌

Do this:
Request → Cache → Response ✅


🔧 Part Three: Query Optimization

📄 Pagination

$users = User::paginate(15);

Instead of blowing up memory with all() 💣


🔄 Chunk Processing

User::chunk(100, function ($users) {
    foreach ($users as $user) {
        // process
    }
});

🎯 Best Practices

  • Use Laravel Debugbar

  • Enable Slow Query Log

  • Monitor queries before the problem grows


📱 Real Case Study

Before:

  • ⏱️ 850ms

  • ❌ 150 queries

After:

  • ⏱️ 120ms

  • ✅ 3 queries

📈 More than 7x performance improvement 🚀

Tags: #Database Optimization #Laravel Performance #Backend Performance #MySQL Optimization