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();
Menyinggahkan halaman semacam ini menyembunyikannya sampai singgahannya dingin, dan pengunjung pertama sesudah setiap penerapan mendapat 400 kueri utuh. Perbaiki dulu jumlahnya, baru singgahkan.
Awasi jumlah kueri seiring halamannya membesar. Halaman yang menjalankan 3 kueri untuk 1 baris dan 300 untuk 100 baris berbentuk seperti ini, apa pun kata angka waktunya hari ini.