Mengoptimalkan Kueri Basis Data
Identifikasi kueri N+1, tambahkan indeks, dan kurangi jumlah kueri.
Mengoptimalkan Kueri Basis Data adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
Mengidentifikasi Kueri Lambat
Aktifkan catatan kueri lambat MySQL dan tetapkan ambang batas. Tinjau kueri yang memerlukan waktu lebih lama dari yang diharapkan.
# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5 # log queries over 500msEXPLAIN / EXPLAIN ANALYZE
Gunakan EXPLAIN untuk memahami cara MySQL menjalankan kueri dan apakah indeks digunakan.
-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)Menambahkan Indeks
Indeks secara drastis mempercepat pembacaan pada kolom yang difilter dan diurutkan.
-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
// In Laravel migration:
$table->index(["user_id", "status"]);Masalah Kueri N+1
Masalah N+1 menjalankan satu kueri untuk mendapatkan daftar, ditambah satu kueri untuk setiap item dalam sebuah relasi. Perbaiki dengan pemuatan awal.
<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;
// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;Pilih Hanya Kolom yang Diperlukan
Hindari SELECT * — ambil hanya kolom yang diperlukan untuk mengurangi penggunaan memori dan transfer jaringan.
<?php
// Bad:
$users = User::all();
// Good:
$users = User::select("id", "name", "email")->get();Membagi Kumpulan Data Besar
Proses kumpulan hasil yang besar dalam beberapa bagian agar memori tidak habis.
<?php
User::chunk(500, function ($users) {
foreach ($users as $user) {
// process each user
}
});
// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));Penyimpanan Kueri dalam Cache
Simpan agregasi dan laporan yang mahal dalam cache jika tidak sering berubah.
<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
return Order::whereMonth("created_at", now()->month)->sum("total");
});Hindari Kueri dalam Perulangan
Jangan pernah menjalankan kueri di dalam perulangan foreach. Kumpulkan ID terlebih dahulu, lalu ambil semuanya dalam satu kueri.
<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");
foreach ($cartItems as $item) {
$product = $products[$item["product_id"]];
}Pengumpulan Koneksi Basis Data
PHP-FPM membuat koneksi PDO baru untuk setiap pekerja. PgBouncer atau ProxySQL dapat mengumpulkan koneksi untuk mencegah basis data terbebani oleh overhead koneksi.
Indeks yang Mencakup
Indeks yang mencakup berisi semua kolom yang diperlukan untuk memenuhi sebuah kueri — MySQL dapat menjawab kueri hanya dari indeks tanpa mengakses baris tabel utama.
Ringkasan
Aktifkan catatan kueri lambat. Gunakan EXPLAIN untuk menemukan indeks yang hilang. Muat relasi secara awal. Pilih hanya kolom yang diperlukan. Bagi kumpulan data besar. Simpan agregasi mahal dalam cache. Hindari kueri di dalam perulangan.
Pemeriksaan Cepat
Apa yang dimaksud dengan masalah kueri N+1?
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengoptimalkan Kueri Basis Data” gratis?
Ya — teks lengkap “Mengoptimalkan Kueri Basis Data” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengoptimalkan Kueri Basis Data”?
Identifikasi kueri N+1, tambahkan indeks, dan kurangi jumlah kueri. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mengoptimalkan Kueri Basis Data” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membuat Profil PHP dengan Xdebug
- OPcache: Caching Bytecode
- Mengoptimalkan Kueri Basis Data
- Manajemen Memori dan Kiat Performa