Milyonlarca kayıtla SQLite'de verimli sayfalama


102

SQLite sonuçlarını bir liste görünümünde göstermem gerekiyor. Elbette sonuçları sayfam gerekiyor.

İlk seçenek LIMIT ibaresini kullanmaktır. Örneğin:

SELECT * FROM Table LIMIT 100, 5000

5001'den 5100'e kadar kayıtları döndürür. Sorun, SQLite'ın dahili olarak ilk 5000 kaydı "okuması" ve çok verimli olmamasıdır.

Çok fazla kayıt olduğunda sayfalama için en iyi yaklaşım nedir?

Yanıtlar:


118

Lütfen her zaman bir ORDER BYcümle kullanmanız gerektiğini unutmayın ; aksi takdirde, sıra keyfidir.

Verimli sayfalama yapmak için, sıralanan alanların ilk / son görüntülenen değerlerini kaydedin ve sonraki sayfayı görüntülerken hemen ardından devam edin:

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;

(Bu, SQLite wiki'de daha ayrıntılı olarak açıklanmıştır .)

Birden çok sıralama sütununuz olduğunda (ve SQLite 3.15 veya üstü), bunun için bir satır değeri karşılaştırması kullanabilirsiniz :

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;

8
SomeColumn'da 101 aynı değere sahip olduğunuz bir duruma ne dersiniz? Bu daha iyi görünüyor: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz

6
@ JacekŁawrynowicz Sıralama sütunu benzersiz değilse, daha fazla sütuna göre sıralamanız gerekir. Her neyse, alternatif bir cevabınız varsa, bir cevap oluşturun.
CL.

@CL bunu birleştirme sorgusu ile yapmak istersem, birden fazla VE koşuluyla nasıl yapılır
YLS

@YLS Günümüzde satır değerlerini kullanabilirsiniz.
CL.

2
Bu yaklaşımı kullanan sorun, bu yorumla
mr5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.