Konuyu Açan
#1
Listeleme ekranlarında sayfa numarasıyla ilerlemek için OFFSET kullanmak çok pratik; ancak derin sayfalarda veritabanının atlayacağı satır sayısı büyüdükçe sorgu maliyeti de artabiliyor. Bir süredir bunun yerine keyset pagination kullanmanın hangi durumlarda gerçekten fark yarattığını merak ediyorum.
Örneğin akışı tarih ve benzersiz kimliğe göre sıraladığımızı varsayalım. Yalnızca
Burada sıralama koşuluyla uyumlu bir bileşik indeks önemli. Sorgu ayrıca
Keyset yönteminde sayfa numarasına doğrudan atlamak zorlaşırken, araya yeni kayıtlar eklendiğinde gezinme çoğu akış senaryosunda daha tutarlı kalabiliyor. Siz üretimde OFFSET’ten keyset’e geçtiniz mi? İndeks tasarımı veya değişen kayıtlar yüzünden karşılaştığınız bir sorun oldu mu?
Örneğin akışı tarih ve benzersiz kimliğe göre sıraladığımızı varsayalım. Yalnızca
created_at ile imleç tutmak yeterli değil; aynı zaman damgasına sahip birden fazla kayıt varsa sayfalar arasında kayıt atlanabilir veya tekrar görülebilir. İkinci bir sıralama anahtarı bu belirsizliği giderir:KOD
12345
WHERE created_at < :cursor_time
OR (created_at = :cursor_time AND id < :cursor_id)
ORDER BY created_at DESC, id DESC
LIMIT 30
Burada sıralama koşuluyla uyumlu bir bileşik indeks önemli. Sorgu ayrıca
tenant_id ile filtreleniyorsa, indeksin başına bu alanı koymak faydalı olabilir; yine de en doğru düzen gerçek sorgu planına ve veri dağılımına bağlı.Keyset yönteminde sayfa numarasına doğrudan atlamak zorlaşırken, araya yeni kayıtlar eklendiğinde gezinme çoğu akış senaryosunda daha tutarlı kalabiliyor. Siz üretimde OFFSET’ten keyset’e geçtiniz mi? İndeks tasarımı veya değişen kayıtlar yüzünden karşılaştığınız bir sorun oldu mu?