Sayfalama — OFFSET mi, Keyset mi?
Önce şunu oku: SQL İndeksleme ve EXPLAIN
30 saniyede özet
OFFSET ile sayfalama basittir ama derinleştikçe her sayfa daha çok satır okur, veri değişince de satırlar tekrar görünür ya da kaybolur. Keyset sayfalama son görülen satırdan devam eder: her derinlikte aynı ucuzluk, tekrarsız sonuç.
Kalın bir romanı okuyorsun ve her akşam kaldığın yeri bulmak için sayfaları baştan saymaya başlıyorsun. İlk günlerde sorun yok. Kitabın sonlarına geldiğinde, okumaya başlamadan önce yüzlerce sayfa sayıyorsun.
-
Bayt: Hesap hareketleri ekranı ilk sayfada hızlı. Ama müşteri eski hareketlere indikçe yavaşlıyor.
-
Sen: Bir de şikâyet var: aynı havale iki sayfada birden görünmüş.
-
Bayt: Aynı sorgu, yalnızca sayfa numarası farklı... nasıl olur?
-
Bayt: Belki sorun sayfa numarasının kendisi. Veritabanı o numarayı nasıl buluyor, bakalım.
OFFSET nasıl çalışır?
OFFSET ile sayfalama"Şu kadar satırı atla, sonrakileri ver" diye sayfalama. Kolaydır ama atlanan satırlar da okunur ve veri değişince sayfalar kayar.Sözlükte gör → veritabanına “şu kadar satırı atla, sonraki 20’yi ver” der. Kurması en kolay yoldur ve kullanıcı istediği sayfa numarasına doğrudan atlayabilir.
Ama veritabanı atlanacak satırları da tek tek yürür: ilk sayfa için 20 satır okur, beş yüzüncü sayfa için 10.000 satır okuyup 9.980’ini atar.
Kafam karıştı, daha basit anlat
OFFSET, önceki bütün satırları okuyup atar. Sayfa derinleştikçe iş büyür.
LIMIT 20 OFFSET 40 veritabanına ne der?
Neden OFFSET ile 500. sayfa ilk sayfadan çok daha yavaştır?
Veri değişince ne olur?
Müşteri 1. sayfadayken 3 yeni havale geldi. Sonra 2. sayfaya geçti (OFFSET 20). Ekranda ne görür? Cevabı göster
İlk sayfanın son 3 hareketini yeniden görür. Yeni havaleler listeyi 3 satır aşağı itti; OFFSET yine 20 satır atladığı için önceki sayfanın sonu ikinci sayfanın başına kaydı.
Adım adım oku
- OFFSET: her seferinde baştan say.
- Öne sayfa eklenirse okuduğun sayfa yine karşına çıkar.
- Keyset: kaldığın yerde bir ayraç.
- Sayıyla değil, son okuduğun yerden devam et.
Tersi de olur: arada bir satır silinirse liste yukarı kayar ve bir satır hiç görünmeden atlanır. OFFSET bir yer tutmaz, yalnızca bir konum sayar.
keyset sayfalamaSon görülen satırın anahtarından devam eden sayfalama (WHERE id < :son). Her derinlikte ucuzdur; belirli bir sayfaya doğrudan atlayamaz.Sözlükte gör → bunun yerine “son gördüğüm id’den eski olan 20 satırı ver” der. İndeks doğrudan o noktaya atlar; önceki satırlar okunmaz ve yeni gelenler pencereyi kaydırmaz.
Kafam karıştı, daha basit anlat
OFFSET konum sayar, veri değişince kayar. Keyset son görülen satırdan devam eder.
Müşteri 1. sayfadayken 3 yeni hareket geldi; sonra OFFSET 20 ile 2. sayfaya geçti. Ne olur?
Keyset sayfalama bir sonraki sayfayı nasıl ister?
Kendin gör
Sayfa sayfa hesap hareketleri
Tohum 993097Oynat ya da adımla: her adım bir sonraki sayfayı getirir.
Şu an ne oldu?
OFFSET ile · Başta (sayfa 1-5)
10.000 hareket, sayfada 20. Her adım bir sonraki sayfayı getirir.
Görevler0/3
Bir hareketi ekranda iki kez gösteraçık
İpucu
Sayfalar arasında yeni hareketler gelsin.
Tek bir sayfa için 10.000 satır okutaçık
İpucu
Derine in.
Derinde, yeni hareketler gelirken her sayfayı 20 satırla ve tekrarsız getiraçık
İpucu
Sayıyla değil, son görülen satırla devam et.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. OFFSET, ilk beş sayfa: en pahalı sayfa yalnızca 100 satır okudu.
- “Derinde” seç. Son sayfa için 10.000 satır okundu; ekranda yine 20 satır var.
- “Başta” seç ve “Bu arada yeni hareket geliyor”u aç. Her yeni sayfada 3 hareket ikinci kez göründü.
- “Keyset” seç, derinde ve yeni hareketlerle oynat. Her sayfa 20 satır okudu ve hiçbir hareket tekrarlanmadı.
Keyset sayfalamanın bedeli nedir?
Sayfalar arasında bir satır silinirse OFFSET ile ne olabilir?
Tuzaklar
Tekrar eden sıralama değeri. Yalnızca tarihe göre sıralarsan, aynı saniyede gelen iki hareketten biri kaybolabilir. Sıralamaya benzersiz bir sütun ekle: (created_at, id) ve ikisini birlikte karşılaştır.
İndekssiz keyset. Keyset’in hızı, sıralama sütunlarındaki bir indeksten gelir. İndeks yoksa veritabanı yine bütün tabloyu tarar.
Her ekranı keyset’e çevirmek: belirli bir sayfa numarasına atlanması gereken bir yönetim tablosu için OFFSET hâlâ uygundur. Keyset en çok sonsuz kaydırma ve “daha fazla göster” ekranlarında parlar.
Kafam karıştı, daha basit anlat
Sıralamayı benzersiz yap, indeksi unutma, sayfa numarası gerekiyorsa OFFSET kalabilir.
Keyset sayfalamada yalnızca created_at ile sıralanıyor. Aynı saniyede iki hareket olursa ne olur?
Aşağıdaki örnek bir mobil bankanın hesap hareketleri ekranından: keyset sorgusu, benzersiz sıralama, istemciye giden bir cursor"Şu kayıttan sonrakiler" diyerek sayfalama. Offset'in aksine sabit maliyetlidir ve araya kayıt girse bile atlama yapmaz; bedeli rastgele bir sayfaya atlayamamaktır.Sözlükte gör →.
Derinleş · Hesap hareketleri: keyset sayfalama ve cursor 4 dosya · ~62 satır · ilk okumada atlayabilirsin
Kendini sına
OFFSET 9980 LIMIT 20, veritabanına yalnızca 20 satır okutur.
Keyset sorgusu yine de yavaş. En olası sebep nedir?
Aklında kalacak üç şey
- 1 OFFSET, istenen sayfadan önceki bütün satırları okuyup atar. İlk sayfalar ucuzdur, ama 500. sayfa için veritabanı 10.000 satır yürür.
- 2 Sayfalar arasında yeni kayıt gelirse OFFSET penceresi kayar: bir önceki sayfanın sonu bir sonrakinin başında yeniden görünür.
- 3 Keyset sayfalama son görülen satırın anahtarından devam eder ve her sayfada yalnızca o sayfanın satırlarını okur. Bedeli, istenen bir sayfaya doğrudan atlayamamaktır.
4 kart sonraki derste seni bekliyor