Sayfalama (sayfa bazında çıktı), büyük SELECT sonuçlarının sunucu ve uygulama üzerinde aşırı yük olmadan işlenmesini sağlar. Ana yaklaşımlar:
Örnek (LIMIT/OFFSET)
SELECT * FROM Orders ORDER BY OrderID LIMIT 100 OFFSET 1000;
Bu sorgu 1011–1110. kayıtları döndürür. Ancak OFFSET, sunucunun ilk 1000 satırı sıralayıp atlamasını gerektirir — bu nedenle derin sayfalama durumunda yavaşlar.
Örnek (Keyset/Seek method)
SELECT * FROM Orders WHERE OrderID > 1110 ORDER BY OrderID LIMIT 100;
Bu tür bir sorgu, OFFSET sayımına kaynak harcamadan bir sonraki sayfayı hızlı bir şekilde bulur, özellikle OrderID üzerinde bir indeks olduğunda son derece etkilidir.
Kandırmaca: "Neden LIMIT/OFFSET ile sayfalama büyük veri hacimlerinde kötü çalışabilir ve bunu nasıl iyileştiririz?"
Yanıt: Zorluk, OFFSET'in sunucunun tüm önceki satırları tarayıp sıralamasını gerektirmesidir — derin sayfalara geçtikçe yavaşlar. Optimizasyon — keyset/seek paging'e geçmek: önceki sayfanın son kaydının anahtarına göre seçim yapmak.
-- Anahtar ile bir sonraki sayfayı alıyoruz SELECT * FROM Orders WHERE OrderID > @LastOrderID ORDER BY OrderID LIMIT 100;
Hikaye
Proje: Pazar yeri, 5 yıl içinde yapılan sipariş veritabanı (50 milyon satır)
Hata: Eski kullanıcıların siparişlerini sayfalamak için OFFSET kullandılar. OFFSET > 1 milyon olan sorgular 30–60 saniye sürdü. Bu, raporlar ve API arayüzü üzerinde etki yarattı — bu nedenle sunucu CPU'su yüklendi ve kuyruktaki bekleme süresi arttı.
Hikaye
Proje: Kurumsal CRM, müşteri raporları.
Hata: Sayfalamada sıralama düzenini dikkate almadılar ve indeks kullanmadılar. Performans düştü ve seçimlerin bütünlüğü kontrolü bozuldu — kullanıcılar tablodaki değişikliklerde farklı sayfalarda aynı satırları aldı.
Hikaye
Proje: Finansal platform, göstergeler.
Hata: Karmaşık sayfalamalar, bağlama değişkenleri olmadan üretilen dinamik SQL üzerinden inşa edildi, bu da SQL enjeksiyonuna ve veri sayfaları arasında işlem dayanıklılığı sorunlarına yol açtı.