Lewati ke konten utama

BAB 56. PERFORMANCE OPTIMIZATION

Target Performa

MetrikTargetKeterangan
Login< 2 detikTermasuk pembuatan token
Dashboard load< 3 detikSemua data dengan cache
AI Matching< 5 detikAsync via queue
Chat realtime< 500 msWebSocket latency
API rata-rata< 300 msUntuk endpoint biasa
Leaderboard< 1 detikDari cache Redis

Optimasi Backend Laravel

1. Eager Loading (N+1 Problem Prevention)

// ❌ Buruk — N+1 query
$requests = Request::all();
foreach ($requests as $r) {
echo $r->student->name; // Query baru setiap iterasi!
}

// ✅ Baik — Eager loading
$requests = Request::with(['student.user', 'subject', 'topic'])->get();

2. Database Indexing

// database/migrations/xxxx_add_indexes.php

Schema::table('requests', function (Blueprint $table) {
$table->index(['school_id', 'status']);
$table->index(['student_id', 'created_at']);
});

Schema::table('bookings', function (Blueprint $table) {
$table->index(['tutor_id', 'status']);
$table->index(['scheduled_at']);
});

Schema::table('ratings', function (Blueprint $table) {
$table->index(['ratee_id']);
});

3. Pagination (Hindari Load Semua Data)

// Selalu gunakan paginate, bukan ->get() untuk daftar
return Request::where('school_id', $schoolId)
->latest()
->paginate(15); // Maksimum 15 per halaman

4. Redis Cache untuk Data Sering Diakses

Lihat BAB 52 — Caching Strategy untuk detail implementasi.

5. Queue untuk Proses Berat

AI Matching, SIS calculation, dan report generation diproses via queue agar API response tetap cepat.


Optimasi Database

Index Utama:

TabelKolomAlasan
usersusernameLogin lookup
studentsschool_id, sis_scoreLeaderboard query
requestsschool_id, statusDaftar request aktif
bookingsscheduled_atMeeting reminder
ratingsratee_idHitung rata-rata rating
meetingscheck_in_atFilter sesi aktif

Query Optimization:

// Gunakan select() untuk ambil kolom yang diperlukan saja
Student::select(['id', 'user_id', 'sis_score', 'level'])
->where('school_id', $schoolId)
->orderByDesc('sis_score')
->limit(100)
->get();

Optimasi Flutter

TeknikImplementasiDampak
const widgetGunakan const di semua widget statisHindari rebuild berulang
Lazy loadingListView.builder bukan ListViewList panjang lebih efisien
Cached imagePackage cached_network_imageKurangi network request
Riverpod cachingkeepAlive: true untuk data jarang berubahKurangi API call
PaginationLoad 15 item per scrollKurangi payload
Skeleton loadingTampilkan skeleton saat loadingUX lebih baik
// Contoh const widget
const BookingCard(
title: 'Matematika - Integral',
tutor: 'Ahmad',
);

// Contoh lazy list
ListView.builder(
itemCount: requests.length,
itemBuilder: (context, index) => RequestCard(request: requests[index]),
)

Monitoring Performa

MetrikToolsThreshold Alert
Response timeLaravel Telescope / Horizon> 500ms
Memory usageServer monitoring> 80%
CPU usageServer monitoring> 75%
Queue lengthLaravel Horizon> 100 pending
Error rateLog monitoring> 1%
Cache hit rateRedis monitoring< 80%