Sebuah halaman bisa lambat tanpa satu pun kueri yang lambat. Dua puluh produk, dan untuk tiap produk satu kueri kategorinya, satu harganya, satu gambarnya: enam puluh satu kueri padahal dua sudah cukup. Masing-masing makan dua milidetik dan halamannya makan satu setengah detik.
Hitung dulu jumlahnya
// at the end of the page
echo count($pdo->query('SHOW SESSION STATUS LIKE "Questions"')->fetchAll());
Atau baca dari bilah awakutu kerangka Anda, atau dari catatan lambat dengan long_query_time disetel 0 untuk satu permintaan saja. Jumlahnya lebih berarti daripada waktu mana pun secara terpisah: di bawah 20 itu wajar, di atas 100 itulah cacatnya.
Seperti apa bentuknya dalam kode
// N+1: one query, then one more per row
$products = query('SELECT * FROM products LIMIT 20');
foreach ($products as $p) {
$p->category = query('SELECT * FROM categories WHERE id = ?', $p->category_id);
}
Perbaikannya sebuah join, atau satu kueri untuk semua identitasnya
$ids = array_column($products, 'category_id');
$cats = query('SELECT * FROM categories WHERE id IN (' . placeholders($ids) . ')', $ids);
// then match them up in PHP
Dua kueri, bukan dua puluh satu, dan tidak memburuk ketika halamannya menampilkan seratus produk - dan justru sifat itulah yang berarti.
Di dalam sebuah ORM
Untuk inilah pemuatan bersemangat ada. Bawaan yang malas itu nyaman dan menghasilkan persis bentuk ini, dan perbaikannya biasanya satu kata.
$products = Product::with('category', 'images')->limit(20)->get();