Kenapa Query Kamu Lambat?
Ketika aplikasimu tumbuh dari ribuan ke jutaan baris, query yang tadinya responsif bisa mendadak terasa lambat. Masalah ini hampir selalu bisa dipecahkan dengan teknik yang tepat.
EXPLAIN: Senjata Utama Debug Query
EXPLAIN SELECT u.name, COUNT(o.id) as total_orders
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.created_at >= "2026-01-01"
GROUP BY u.id;
Yang perlu diperhatikan dari output EXPLAIN:
- type: Idealnya
refataurange. HindariALL(full table scan) - rows: Semakin kecil, semakin efisien
- Extra:
Using filesortadalah tanda bahaya
Teknik Indexing yang Benar
-- Composite index sesuai pola query
-- Untuk: WHERE user_id = ? AND status = ? ORDER BY created_at
CREATE INDEX idx_user_status_date ON orders(user_id, status, created_at);
-- Aturan: kolom untuk equality (=) dahulu, lalu range/sort
Pagination Efisien untuk Data Besar
-- BURUK: OFFSET besar sangat lambat di halaman 100+
SELECT * FROM posts ORDER BY id DESC LIMIT 20 OFFSET 2000;
-- BAGUS: Cursor-based pagination
SELECT * FROM posts
WHERE id < :last_seen_id
ORDER BY id DESC
LIMIT 20;
Caching dengan Redis
$redis = new Predis\Client();
$cacheKey = "top_products_" . date("Y-m-d");
$products = $redis->get($cacheKey);
if (!$products) {
$products = DB::select("SELECT ... FROM products ...");
$redis->setex($cacheKey, 3600, json_encode($products));
} else {
$products = json_decode($products, true);
}
Checklist Optimasi Database
- Gunakan EXPLAIN untuk setiap query yang lambat
- Index semua kolom yang sering digunakan di WHERE dan JOIN
- Pilih kolom spesifik, jangan SELECT *
- Gunakan cursor pagination untuk data jutaan baris
- Cache query agregat dengan Redis
- Aktifkan slow query log MySQL untuk monitoring
Kesimpulan
Optimasi database adalah keahlian yang membedakan developer biasa dari yang berpengalaman. Dengan indexing yang tepat, cursor pagination, dan caching Redis, kamu bisa meningkatkan performa ratusan kali lipat tanpa upgrade hardware.